在'printf'之后使用'fgets'作为'fgets'在'printf'之前运行的C语言问题

时间:2012-07-20 07:52:37

标签: c printf fgets

  

可能重复:
  Why does printf not flush after the call unless a newline is in the format string? (in C)

我在使用printffgets时出现问题,因为我的代码printf早于fget编写但它没有运行,它在fgets运行之后运行。

enum { max_string = 127 };
static char string[max_string+1] = "";

int main( int argc, char ** argv ) {    
      printf("Type a String: ");
      fgets(string, max_string, stdin);
      printf("The String is %s\n", string);
      return 0;
}

4 个答案:

答案 0 :(得分:6)

刷新stdout

fflush(stdout);

之前fgets(...)

printf("Type a String: ");  
fflush(stdout);
fgets(string, max_string, stdin); 

答案 1 :(得分:0)

\n语句中添加printf。这可能是问题,因为C缓冲区是行终止的。

答案 2 :(得分:0)

Neel是对的。如果你想写一些东西而不必把它放在'\ n'你可以使用函数write();

#include <stdio.h>
#include <unistd.h>
#include <string.h>

enum { max_string = 127 };
static char string[max_string+1] = "";


my_putstr(char *str)
{
     write(1, str, strlen(str));
}

int main( int argc, char ** argv ) {    
    my_putstr("Type a String: ");  
    fgets(string, max_string, stdin); 
    printf("The String is %s\n", string);
    return 0;
}

答案 3 :(得分:0)

要点不是printffgets之后运行,而是其输出显示在它之后。

这是因为标准输出(您使用printf编写的文件描述符)是行缓冲的,即标准库在换行符后延迟打印({{1已收到打印。

来自\n

  

当流stdout指向终端时,它是行缓冲的。   在调用fflush(3)或exit(3)之前,不会出现部分行,或者   打印换行符。

要调查不同的结果,请修改您的示例以使用man stdout,或使用fflush打印标准错误。