我编写了这段代码以在终端中产生下雨矩阵效果:
#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/