我是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
*/
答案 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);