我想从stdin
获得一位数字。使用scanf("%d",&choice);
并不好,因为如果输入像3fjios
或fjaifdj
之类的东西那么它会保留数字之后的所有内容(如果有的话),所以如果以后我有scanf("%s",name);
它需要其他字符并搞乱。并且使用scanf
也很糟糕(或者似乎来自Google)。
经过大量挖掘后,我明白我们应该使用fgets
,将输入读入字符串,然后解析它。但!无处解释如何在之后正确清除缓冲区。所以如果我这样做:
char choice[3];
do {
fgets(choice, 3, stdin);
scanf("%*[^\n]");
scanf("%*c");//clear upto newline
} while (choice[1] != '\n');
这只有在我输入长度超过2个字符的字符串时才有效。当我为fgets
输入一个字符时,scanf
实际上等待另一个输入......这很糟糕。
另一个大问题是如果我输入超过2个字符(一个数字和'\n'
),那么前两个字符进入choice
,其余字符卡在缓冲区中。清除它的所有方法似乎都需要先建造一座核电站...而且,如果用户输入一个无限长(很长)的长串,会发生什么?
您能否请出示一种简单的方法,允许用户输入一些某些(未知)长度的字符串,然后正确检查它在开始时是否包含完整的单个数字,然后是'\n'
?任何其他输入应该循环返回以再次从用户获得新输入。请不要使用复杂的解决方案,只需标准的简单C即可。
我不敢相信我浪费了6个小时来处理这个简单的技术问题,只是从用户那里得到了一个输入。解决实际问题更容易......
不要使用scanf。它使事情变得过于复杂。只需使用getchar读取并丢弃该行。例如:
int read_input(void) {
int n;
n = getchar();
if( getchar() == '\n' || n == EOF)
return n;
else
do n = getchar(); while ( n != '\n' && n != EOF);
fputs("invalid entry: ", stderr);
return read_input();
}
int main(void) {
int input;
input = read_input();
printf("user entered: %c\n", input);
return EXIT_SUCCESS;
}