如何使用fgets获取一个数字并在之后清理stdin,没有其他任何帮助

问题描述 投票:1回答:1

我想从stdin获得一位数字。使用scanf("%d",&choice);并不好,因为如果输入像3fjiosfjaifdj之类的东西那么它会保留数字之后的所有内容(如果有的话),所以如果以后我有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个小时来处理这个简单的技术问题,只是从用户那里得到了一个输入。解决实际问题更容易......

c
1个回答
2
投票

不要使用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;
}
© www.soinside.com 2019 - 2024. All rights reserved.