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。