试图了解在C中如何发生不同的输入方式,但是fgets()倾向于跳过

时间:2018-10-23 14:57:18

标签: c input fgets

我是C语言的新手,正在尝试学习不同的输入如何工作。我编写了这段代码,尝试使用getChar(),sscanf()和fgets()。我的第一个fgets()可以很好地工作,但是在我要求用户输入日期之后它跳过了第二个。我是否以不应使用的方式使用这些功能。有什么可能的方法来解决这个问题。

还有其他一些接收用户输入的方式,这些方式在某些场景下会更加有益。

#include <stdio.h>

#define MAX 12
#define MAX_DATE 100

int main(int argc, const char * argv[]) {

    char buf[MAX];
    char date[MAX_DATE];
    char day[9], month[12];
    int year;

    printf("This code shows various ways to read user input and also how to check for input\n");

    printf("Enter a String less than 11 characters for input: ");
    fgets(buf, MAX, stdin); //stdin is used to indicate input is from keyboard

    printf("Enter a char: ");
    char inputChar = getchar(); //gets next avalible char

    printf("\nThe char you entered is: "); putchar(inputChar); //puts char prints a char

    printf("\nsscanf allows one to read a string and manupilate as needed.\n");
    printf("\nEnter a date as follows: Day, Month, Year");

    fgets(date, MAX_DATE, stdin);
    sscanf(date, "%s, %s, %d", day, month, &year);

    printf("\nFormatted values as follows... \n");
    printf("day: %s\n", day);
    printf("month: %s\n", month);
    printf("year: %d\n", year);

    return 0;
}
/*
Output for the code:
This code shows various ways to read user input and also how to check for input
Enter a String less than 11 characters for input: hey
Enter a char: a

The char you entered is: a
sscanf allows one to read a string and manupilate as needed.

Enter a date as follows: Day, Month, Year
Formatted values as follows... 
day: 
month: 
year: -1205589279
Program ended with exit code: 0
*/

2 个答案:

答案 0 :(得分:0)

第二个fgets不会被跳过。它正在处理您的其余部分。

在您的示例中,当出现“输入字符:”提示时,您输入的是“ a”,后跟换行符。 getchar获得“ a”字符。 fgets随后直接从字符开始,这意味着它正在读取“ a”之后的换行符并返回。

如果您在fgets(buf, MAX, stdin);之后调用getchar()以丢弃其余行,则程序将按预期运行。

答案 1 :(得分:0)

@contrapants很好地解释了“跳过第二个”的原因。当用户键入 a Enter 时,'a'将读取getchar(),然后{{1}将读取'\n' },而无需等待其他输入。

对于学习者,我建议仅使用fgets()进行输入。

fgets()

  

我是否以不应该使用它们的方式使用这些功能。

读入缓冲区而没有确保没有溢出时,会出现一个副作用。使用宽度限制。

 printf("Enter a char: ");
 fgets(buf, sizeof buf, stdin);
 char inputChar = 0;
 sscanf(buf, "%c", &inputChar);