程序挂起一半的时间

时间:2014-03-23 06:53:57

标签: c

我编写了以下程序来显示随机角色的东西(来自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");)之前挂起。其他时候程序会将字符更改一次或两次然后挂起。为什么程序停滞不前?

1 个答案:

答案 0 :(得分:3)

由于stdout在C中缓冲,因此不会打印初始printf。您必须在printf之后放置fflush(stdout);。然后程序可以无限循环,因为您将0-9范围内的随机值分配给lines,然后尝试在0-7范围内生成最多lines个唯一数字。如果lines == 9,您将无限循环。