当我在下面的代码段中使用fgets而没有printf中的换行符时,程序不会等待我的输入。看起来要么在使用刷新之前在printf语句中使用新的行字符,stdin修复了问题。但是,有人可以了解正在发生的事情以及为什么\ n或者flsuhing修复它?
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char *userInput = malloc(sizeof(*userInput) * 2);
printf("Enter a character:"); // This leads to an issue where fgets does not wait for an input
/*
Using either of the below statements fixes it though
printf("Enter a character:\n");
OR
fflush
*/
fgets(userInput, 2, stdin);
printf("The character you entered is: %c \n", userInput[0]);
}
谢谢!
答案 0 :(得分:1)
对于所有C运行时,我知道stdout
在连接到终端时是行缓冲的(并且在连接到其他任何东西时缓冲了块),因此当换行符时,输出仅刷新到屏幕输出,或fflush
用于显式刷新缓冲区。如果没有换行符(或fflush(stdout)
调用),printf
输出将转到缓冲区,但永远不会刷新到屏幕。
显然,fflush(stdout)
修复此问题,实际输出换行符也是如此。您还可以使用the setvbuf
function全局禁用stdout
的缓冲,但这会降低I / O的速度。
答案 1 :(得分:0)
这是让用户输入单个字符然后将该字符回显到终端
的正确方法#include <stdio.h>
int main(void)
{
int userInput;
printf("Enter a character:\n");
if( (userInput = getchar() != EOF) )
{
printf("The character you entered is: %c \n", userInput);
}
}
您的评论讨论用户输入两个字符,但您的代码只查找1个字符(如您对用户的提示所示)