C 如何使用fgets获得一个数字并在之后清理stdin,没有其他帮助
我正试图从C 如何使用fgets获得一个数字并在之后清理stdin,没有其他帮助,c,C,我正试图从stdin获取一位数字。 使用scanf(“%d”和&choice)不好,因为如果输入了3fjios或fjaifdj之类的内容,那么它会将所有内容保留在数字后面(如果有),因此如果以后我有scanf(“%s”,name)它需要其他字符和混乱。而且使用scanf也不好(或者从谷歌看来是这样) 经过大量挖掘,我明白我们应该使用fgets,将输入读入字符串,然后解析它。 但是没有解释如何在事后正确清除缓冲区。 因此,如果我做一些类似的事情: char choice[3]; do {
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个字符进入选项
,其余的都卡在缓冲区中。所有清理核电站的方法似乎都要求首先建造一座核电站。。。
另外,如果用户输入一个无限长的字符串会发生什么
您能否提供一种简单的方法,允许用户输入某些(未知)长度的字符串,然后正确检查其开头是否正好包含一位数字,后跟'\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;
}
您是否必须使用fgets
,或者您是否愿意接受C语言中任何可能的解决方案?问题是,如果您输入456
,它将用代码保留第二个循环的6
。只需用%d
扫描并检查返回值,丢弃剩下的。把浪费6个小时归咎于没有遵守学习C的一条基本规则:“不要使用scanf”。它很复杂,让初学者感到困惑,使用它会阻止学习者使用其他对学习有用的技巧。如果您发现scanf适用的问题,那么C可能是错误的语言。@Elyasin任何东西都可以接受。谢谢,我有一个问题:在这行中:如果(getchar()='\n'| | n==EOF)n==EOF用于什么?如果我们是从stdin读取,那么没有文件结尾字符?你能解释一下这个比特吗?考虑<代码> PrimTf 5×CMD < /代码>(CMD是你的可执行文件)。在这种情况下,对getchar的第一个调用返回一个'5'
(一个在本地字符集中为5的整数值)。对GETCHAR的第二次调用返回EOF(这不是一个‘char’。它是一个整数值)。注意我的代码没有很好地处理文件的末尾,还有一些边缘情况需要考虑。不要将stdin与tty混为一谈,记住,即使stdin连接到tty,也可以关闭输入流(在Linux上,使用^d),这将导致getchar返回EOF。