5

可能重复:
为什么 printf 在调用后不刷新,除非换行符在格式字符串中?(在 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

4 回答 4

7

冲洗一下stdout

fflush(stdout);

fgets(...)

printf("Type a String: ");  
fflush(stdout);
fgets(string, max_string, stdin); 
于 2012-07-20T07:58:38.577 回答
1

关键不是printf在 之后运行fgets,而是在它之后显示它的输出

发生这种情况是因为标准输出(您使用 编写的文件描述符)是行缓冲的,即标准库在收到printf换行符 ( ) 进行打印后推迟打印。\n

来自man stdout

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

要研究不同的结果,请编辑您的示例以使用fflush,或使用 打印标准错误fprintf(stderr, ...

于 2012-07-20T08:01:01.047 回答
0

尼尔是对的。如果您只想写下某些内容而不必输入“\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;
}
于 2012-07-20T08:00:15.410 回答
0

发表声明\nprintf这可能是问题,因为C缓冲区是行终止的。

于 2012-07-20T07:55:14.183 回答