我正在尝试从stdin获取一位数数字。使用scanf("%d",&choice);并不好,因为如果输入像3fjios或fjaifdj这样的东西,它会保留数字后面的所有内容(如果有),所以如果后来我使用scanf("%s",name);,它会占用其他字符并造成混乱。而且,使用scanf也很糟糕(至少在谷歌看来是这样)。
经过大量的研究,我明白我们应该使用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'),那么前2个字符进入choice,其余的则卡在缓冲区中。所有清除它的方法似乎都需要先建造一座核电站……另外,如果用户输入一个无限长(非常长)的字符串,会发生什么?
你能展示一个简单的方法,允许用户输入一些(未知的)长度的字符串,然后正确地检查它是否在开始时只包含一个数字,然后是'\n'?任何其他输入都应该循环回来,以便再次从用户那里获得新的输入。请不要使用复杂的解决方案,只使用标准的简单的C语言。
我不敢相信我浪费了6个小时在这个理应简单的技术事情上,仅仅是从用户那里获取输入。解决实际问题更容易..。
发布于 2017-12-17 22:25:18
不要使用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;
}https://stackoverflow.com/questions/47855955
复制相似问题