在’printf’之后使用’fgets’作为’fgets’在C语言中出现’fgets’在’printf’之前运行
可能重复:
除非换行符在格式字符串中,为什么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(...)
之前fgets(...)
printf("Type a String: "); fflush(stdout); fgets(string, max_string, stdin);
把一个\n
放在printf
语句中。 这可能是问题,因为C
缓冲区是行终止的。
尼尔是对的。 如果你只想写下一些东西而不必把它放在’\ n’你可以使用函数write();
#include #include #include 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)或exit(3)或打印换行符之前,不会出现部分行。
要调查不同的结果,请编辑您的示例以使用fflush
,或使用fprintf(stderr, ...
打印标准错误)。