可能重复:
为什么不printf的调用后,除非换行符是格式字符串冲洗? (C)中
我正在使用问题printf
和fgets
在我的代码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;
}
做的冲洗stdout
fflush(stdout);
之前fgets(...)
printf("Type a String: ");
fflush(stdout);
fgets(string, max_string, stdin);
把\n
中printf
声明。 在这可能是问题C
缓冲区行终止。
尼尔是正确的。 如果你想只写下来的东西,而不必把那个“\ n”你可以使用函数写();
#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;
}
问题的关键不在于printf
后运行fgets
,而是之后,它会显示其输出 。
这是因为标准输出 (你有写文件描述符printf
)是行缓冲,即标准库延迟一个换行符(后打印\n
)已收到打印。
从man stdout
:
流stdout是行缓冲时它指向一个终端。 局部线将不会出现,直到fflush(3)或出口(3)被调用时,或印刷有换行符。
为了研究不同的结果,编辑您例如使用fflush
,或使用标准错误打印fprintf(stderr, ...
。
文章来源: Issue in C language using 'fgets' after 'printf' as 'fgets' runs before 'printf' [duplicate]