我编写了以下程序来显示随机角色的东西(来自Predator
电影的灵感来源:
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
char line0[100];
char line1[100];
char line2[100];
char line3[100];
char line4[100];
char line5[100];
void addImage(short *image);
int main(int argc, char **argv) {
printf("\e[1;1H\e[2J");
while (1) {
for (int i = 0; i < 5; i++) {
short image[] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
short lines = arc4random() % 10;
for (int j = 0; j < lines; j++) {
short pos;
do {
pos = arc4random() % 8;
} while (image[pos] != 0);
image[pos] = 1;
}
addImage(image);
}
printf("%s\n", line0);
printf("%s\n", line1);
printf("%s\n", line2);
printf("%s\n", line3);
printf("%s\n", line4);
printf("%s\n", line5);
sleep(1);
sprintf(line0, "");
sprintf(line1, "");
sprintf(line2, "");
sprintf(line3, "");
sprintf(line4, "");
sprintf(line5, "");
printf("\e[6F");
}
return 0;
}
void addImage(short *image) {
snprintf(line0, sizeof(line0), "%s _______ ", line0);
snprintf(line1, sizeof(line1), "%s| | ", line1);
snprintf(line2, sizeof(line2), "%s| %c %c %c | ", line2, image[0] ? '\\' : ' ', image[1] ? '-' : ' ', image[2] ? '/' : ' ');
snprintf(line3, sizeof(line3), "%s| %c %c %c | ", line3, image[3] ? '|' : ' ', image[4] ? '-' : ' ', image[5] ? '|' : ' ');
snprintf(line4, sizeof(line4), "%s| %c %c %c | ", line4, image[6] ? '/' : ' ', image[7] ? '-' : ' ', image[8] ? '\\' : ' ');
snprintf(line5, sizeof(line5), "%s|_______| ", line5);
}
/* _______
| |
| \ - / |
| | - | |
| / - \ |
|_______|
*/
问题在于,当我运行它时,有时程序会在调用清晰的屏幕行(printf("\e[1;1H\e[2J");
)之前挂起。其他时候程序会将字符更改一次或两次然后挂起。为什么程序停滞不前?
答案 0 :(得分:3)
由于stdout在C中缓冲,因此不会打印初始printf。您必须在printf之后放置fflush(stdout);
。然后程序可以无限循环,因为您将0-9范围内的随机值分配给lines
,然后尝试在0-7范围内生成最多lines
个唯一数字。如果lines
== 9,您将无限循环。