目录

C语言让字符活起来探索C语言中的动态打印艺术

【C语言】让字符“活”起来——探索C语言中的动态打印艺术

https://i-operation.csdnimg.cn/images/cf31225e169b4512917b2e77694eb0a2.pngC语言动态打印艺术

引言

        在大多数人的认知里,C语言的printf函数只是将静态文本打印到屏幕上的简单工具。然而,编程的创造力能够突破这一固有印象——通过巧妙的延时、清屏与光标控制,我们可以让printf输出的字符仿佛获得生命,创造出文字流动显示等丰富的动态效果。这种技术将枯燥的命令行界面转变为充满动感的交互体验,其核心并非依赖复杂的库,而是对基础功能的深入理解和灵活运用。本文将带你探索如何用最简单的C语言语法,唤醒字符的活力,打造出引人入胜的动态打印世界。


相关知识扩展:

1. #include <windows.h>:

  • 作用:这是一个预处理器指令,用于包含 Windows API 的头文件。
  • 详细说明windows.h 是 Windows 编程的核心头文件,它提供了访问操作系统功能的接口,包括您下面使用的 Sleep() 函数以及 system() 函数所需的一些基础定义。

2. Sleep(1000):

  • 作用:这是一个 Windows API 函数,用于暂停当前程序的执行。

  • 参数1000 表示暂停的毫秒数。1000 毫秒 = 1 秒

  • 注意

    • 函数名 Sleep 的 ‘S’ 必须大写
    • 调用这个函数会使当前线程挂起指定的时间,在此期间程序不会执行任何操作。

3. system("cls"):

  • 作用:调用系统命令来清空控制台窗口
  • 参数"cls" 是一个字符串参数,它是 Windows 命令提示符(CMD)中的清屏命令。
  • 原理system() 函数会启动操作系统的命令解释器(通常是 cmd.exe),并让它执行 cls 这个命令。
  • 注意:要使用 system() 函数,通常还需要包含 stdlib.h 头文件(在 Windows 环境下,有时由于 windows.h 的间接包含,不写也能编译,但为了代码的可移植性和清晰性,最好加上)。

案例1:

如果我想打印:开始显示“*******************”这种字符串,然后让“welcome to China!!!!!”这个字符串分成两半从左右两边依次流动出现。大概效果如下:

https://i-blog.csdnimg.cn/direct/b87b9c1e04584223a2f2e845db0428cc.png

代码实现1:

#include <stdio.h>
#include <windows.h>
#include <stdlib.h>

int main()
{
		//这里两个字符串一样长
	char arr1[] = "********************";
	char arr2[] = "Welcom to China!!!!!";
	int left = 0, right = 0;
	right = sizeof(arr2) / sizeof(arr2[0]) - 1;//求字符串长度
	right = right - 1;//求数组的最大下标
	printf("%s", arr1);
	Sleep(1000);//延迟1秒钟(单位是1ms)
	while (left <= right)
	{
		system("cls");//将显示器内容清空
		arr1[left] = arr2[left];
		arr1[right] = arr2[right];
		printf("%s\n", arr1);
		Sleep(1000);//延迟1秒钟(单位是1ms)
		left++;
		right--;
	}
	return 0;
}

案例2:

我们让“welcome to China!”这个字符串从左向右流动出来:

https://i-blog.csdnimg.cn/direct/550f2e43e4464afbbce927655f915c30.png

https://i-blog.csdnimg.cn/direct/fb16c4716d914bce99c2a2743652e88f.png

代码实现2:

#include <stdio.h>
#include <windows.h>
#include <string.h>
#include <stdlib.h>

int main()
{
    char a[] = "welcome to China!";
    char b[] = "                 ";
    int n = strlen(a);
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j <= i; j++)
        {
            b[j] = a[n - i - 1 + j];
        }
        system("cls");
        printf("%s\n", b);
        Sleep(300);        
    }
    return 0;
}

案例3:

我们让“welcome to China!”这个字符串从左到右出来,继续向右滚动,直到消失:

https://i-blog.csdnimg.cn/direct/57f645c6c777404f89c2715bfeedfbff.png

https://i-blog.csdnimg.cn/direct/1c05610894674d4289ce737088494b83.png

https://i-blog.csdnimg.cn/direct/89ec219c2a694d39ae299ac7cda723ed.png

代码实现3:

#include <stdio.h>
#include <windows.h>
#include <string.h>
#include <stdlib.h>


int main()
{
    char a[] = "welcome to China!";
    char b[] = "                 ";
    char c[] = "                 ";
    int n = strlen(a);
    //printf("%d",n);

    for (int i = 0; i < n-1; i++)
    {
        for (int j = 0; j <= i; j++)
        {
            b[j] = a[n - i - 1 + j];
        }
        system("cls");
        printf("%s\n", b);
        Sleep(200);
    }

    for (int i = 0; i <= n; i++)
    {
        int k = 0;
        for (int i = 0; i < n; i++)
            c[i] = ' ';
        for (int j = i; j < n; j++)
        {
            c[j] = a[k];
            k++;
        }
        system("cls");
        printf("%s\n", c);
        Sleep(200);
    }

    return 0;
}

案例4:

依然是让“welcome to China!”这个字符串从左到右出来,继续向右滚动,直到消失,不过这里可以让这个动画重复滚动显示几遍。

https://i-blog.csdnimg.cn/direct/4183a77ba03a4717862aaf32fb6e4ee0.png

https://i-blog.csdnimg.cn/direct/4b1bca74eb4347e18e10282ece2ee9bb.png

https://i-blog.csdnimg.cn/direct/059650610990415aa2ab456d42f7c8fa.png

部分画面截取

要实现字符串滚动出现-消失-出现-消失,一直从左到右滚动循环显示。请看下面的代码:

代码实现4:

#include <stdio.h>
#include <windows.h>
#include <string.h>
#include <stdlib.h>
#define l 17

void display(char a[l], char b[l], char c[l])
{
    for (int i = 0; i < l - 1; i++)
    {
        for (int j = 0; j <= i; j++)
        {
            b[j] = a[l - i - 1 + j];
        }
        system("cls");
        printf("%s\n", b);
        Sleep(200);
    }

    for (int i = 0; i <= l; i++)
    {
        int k = 0;
        for (int i = 0; i < l; i++)
            c[i] = ' ';
        for (int j = i; j < l; j++)
        {
            c[j] = a[k];
            k++;
        }
        system("cls");
        printf("%s\n", c);
        Sleep(200);
    }
    
}

int main()
{
    char a[] = "welcome to China!";
    char b[] = "                 ";
    char c[] = "                 ";
    int n = strlen(a);

    for(int i =0;i<=5;i++)
    { 
        display(a, b, c);
        for (int j = 0; j < l; j++)
        {
            b[j] = ' ';
        }
        for (int j = 0; j < l; j++)
        {
            c[j] = ' ';
        }
    }
    
    return 0;
}

案例5:

让“welcome to China!”这个字符串从左到右滚动出现再消失,在第一行流动显示完,接着在第二行流动显示,接着第三行………..

https://i-blog.csdnimg.cn/direct/e8d4211208254ef78d4789823e14b3fe.png

部分画面截取

https://i-blog.csdnimg.cn/direct/a2ccce276bf344269fbd0b62f134a8ec.png

部分画面截取

https://i-blog.csdnimg.cn/direct/f7f3ab3449fa412da5aff22e662abec7.png

部分画面截取

代码实现5:

#include <stdio.h>
#include <windows.h>
#include <string.h>
#include <stdlib.h>
#define l 17

void display(char a[l], char b[l], char c[l],char d[l],int x)
{
    for (int i = 0; i < l - 1; i++)
    {
        for (int j = 0; j <= i; j++)
        {
            b[j] = a[l - i - 1 + j];
        }
        system("cls");
        //从第二行开始,前面所有行用空格占据
        for (int k = 0; k < x; k++)
        {
            printf("%s\n", d);
        }
        printf("%s\n", b);
        Sleep(200);
    }
    for (int i = 0; i <= l; i++)
    {
        int k = 0;
        for (int i = 0; i < l; i++)
            c[i] = ' ';
        for (int j = i; j < l; j++)
        {
            c[j] = a[k];
            k++;
        }
        system("cls");
        //从第二行开始,前面所有行用空格占据
        for (int k = 0; k < x; k++)
        {
            printf("%s\n", d);
        }
        printf("%s\n", c);
        Sleep(200);
    }
}


int main()
{
    char a[] = "welcome to China!";
    char b[] = "                 ";
    char c[] = "                 ";
    char d[] = "                 ";
    int n = strlen(a);


    for (int i = 0; i < 5; i++)
    {
        display(a,b,c,d,i);
        //每次打印完就初始化
        for (int j = 0; j < 17; j++)
        {
            b[j] = ' ';
        }
        for (int j = 0; j < 17; j++)
        {
            c[j] = ' ';
        }
    }
    return 0;
}

总结

        通过这段巧妙的C语言代码,我们实现了一个在控制台(命令行)中展示字符串“welcome to China!”的动态滚动动画。其核心原理并不复杂,但却非常经典,完美展示了如何通过基本的编程元素创造出视觉上的动态效果。

核心技术要点总结如下:

  1. 动态字符串处理: 代码的核心在于对字符数组的精确操作。通过循环和索引计算,动态地改变两个临时数组 b 和 c 的内容,一个用于模拟字符串从右侧逐渐展开的效果,另一个用于模拟字符串向左侧逐渐收缩消失的效果。
  2. 清屏与循环的配合: system("cls") 命令用于在每一次循环后清除控制台当前的输出内容。紧接着,printf 会立即打印出更新后的字符串。这种“清屏-重绘”的快速迭代在人眼中就形成了流畅的动画。
  3. 控制动画节奏: Sleep() 函数是控制动画速度的关键。它在每次循环后引入一个短暂的延迟(如200毫秒),使得每一帧画面都能被人眼清晰地捕捉到,从而形成舒适的视觉体验,而非一闪而过的乱码。
  4. 空间与格式: 代码中大量的 \n 和空格用于将动画输出定位到控制台的中心区域,增强了演示的观赏性和仪式感。

总而言之, 这个程序是一个很好的示例,它说明了如何将循环、数组操作、清屏命令和延时函数这些基础概念结合起来,实现超越静态文本的动态视觉效果。它不仅是一个有趣的编程小品,也非常适合C语言初学者理解和学习控制台动画的基本实现思路。

        需要注意的是,由于使用了Windows特有的 windows.h 头文件和 system("cls") 命令,此代码主要在Windows环境下运行。若要跨平台,需要进行相应的修改(如使用ANSI转义序列或其他库)。