令人困惑的C程序行为,printf

时间:2017-04-21 04:52:42

标签: c printf

为什么printf(“提示符:”)不会立即打印?我尝试过fflush(stdout)并放置一个\ n,但这些都没有。它只在“看你”打印时打印:

int main() {
    char line[1025];
    char command[80], argument[80];
    char argv[3][80];
    int i, pid;
    *(argv[2]) = '\0';

    while((fgets(line, 1024, stdin))) {
      printf("prompt:");

      line[1024] = '\0';
      sscanf(line, " %s %s ", command, argument);

       if(strcmp(command, "exit") == 0 || strcmp(command, "hastalavista") == 
          0) {
          printf("See you\n");
          exit(0);
       } 
    }
  return 0;
  }

2 个答案:

答案 0 :(得分:5)

标准I / O(即来自<stdio.h>的函数)缓冲(通常是行缓冲的,特别是stdout)。

您需要刷新它(例如通过调用fflush(stdout);

顺便说一下,您在 fgets之前呼叫printf("prompt:"); 。看起来不对劲。我建议在调用printf("prompt:"); fflush(stdout);之前fgets

当然,你应该编译所有的警告&amp;调试信息(例如gcc -Wall -g如果使用GCC)和使用调试器(例如gdb

最后,在POSIX系统上,您可以使用getline(3)。在Linux系统上,您甚至可以使用readline(3)

使用sscanf,您最好测试其退货项目数(您可能希望使用%n)。

您可能应该阅读有关终端的更多信息(至少在POSIX系统上),例如: tty demystified页面,以及line discipline。另见termios(3)&amp; I satty(3)

答案 1 :(得分:3)

while((fgets(line, 1024, stdin))): - 这意味着从stdin读取并将内容放入line。在收到EOF或换行符后,fgets才会返回。这意味着,您的代码将等待,直到您按下&#34;输入&#34;键。

如果你不按它,它就不会继续打印&#34;提示&#34;。这就是延迟的原因!

而且,按Enter键之前输入的内容将存储在line(最多1024个字节)