有人可以在我的程序中解释fgets的行为吗?

时间:2018-03-24 04:10:44

标签: c

当我在下面的代码段中使用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]);

}

谢谢!

2 个答案:

答案 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个字符(如您对用户的提示所示)