c - 如何编写终端矩阵效果?

标签 c

我编写了这段代码以在终端中产生下雨矩阵效果:

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

int main(){
char characters [83] = {'A', ' ', 'B', 'C', ' ', 'D', 'E', ' ', 'F', 'G', ' ', 'H', 'I', ' ', 'J', 'K', 'L', ' ', 'M', 'N', 'O', ' ', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', ' ', 'W', 'X', 'Y', 'Z', 'a', ' ', 'b', 'c', 'd', 'e', 'f', 'g', 'h', ' ', 'i', 'j', 'k', 'l', 'm', ' ', 'n', 'o', 'p', 'q', 'r', ' ', 's', 't', 'u', ' ', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', ' ', '9', '!', '%', '&', ' ', '?', '#', '*'}; 
int i = 0;
int index_array;
srand(time(0));

struct timespec tim, tim2;
tim.tv_sec = 0;
tim.tv_nsec = 10000000L;
for (i=0; i < 20; i++){
    index_array = (rand()%83)+1;
    printf("%c", characters[index_array]);
    nanosleep(&tim, &tim2);
}   
printf("\n");
main();
}

但我有一个问题:

1.) 代码一次打印 20 个字符,并等待 nanosleep(),而不是每个字符都是单个字符,并在打印下一个字符之前等待 nanosleep()。 ..

希望你能帮助我,这个问题不是那么愚蠢......谢谢。

最佳答案

您一次看到 20 个字符的原因是程序(或在后台运行的 C 运行时)缓冲了标准输出流。仅当它获得换行符或缓冲区已满时,它才会将缓冲区内容传递到流中。这就是我们所说的缓冲区刷新。您可以使用一个库函数来强制刷新:fflush()。因此,这就是您需要在 printf 语句后面执行的操作: fflush(stdout);

我在代码中看到的下一个问题是,您计算了一个介于 1 到 83 之间的随机索引。但是您的数组仅包含 83 个字符,这意味着正确的索引应该介于 0 到 82 之间。

最后但并非最不重要的一点是,您是我第一个看到递归调用 main() 来模仿无尽循环的人。这不是一个好的做法,因为你的程序很快就会开始膨胀,最终破坏整个内存,导致计算机崩溃......等等。你不是故意的,是吗? ;) 但是,为此使用循环(当然不是崩溃。)

关于c - 如何编写终端矩阵效果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46140235/

相关文章:

c - 如何在多个模块中使用全局数组

不能返回负值

c - For 循环在条件 (C) 之前停止

代码编辑器 - 仍然存在未解析的符号

c - C中data段和bss段的区别

c - 将数组传递给函数 (C/CPP)

c - 不要正确加密 wincrypt

c - 如何初始化数组?

c - 如何在不删除项目的情况下查看 Linux (POSIX) 消息队列?

c - 如何从 ARM 微 Controller 的 GPIO 端口读取值?