首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用fgets获取一个数字并在之后清理stdin,没有其他的帮助

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

Stack Overflow用户
提问于 2017-12-17 22:11:51
回答 1查看 240关注 0票数 1

我正在尝试从stdin获取一位数数字。使用scanf("%d",&choice);并不好,因为如果输入像3fjiosfjaifdj这样的东西,它会保留数字后面的所有内容(如果有),所以如果后来我使用scanf("%s",name);,它会占用其他字符并造成混乱。而且,使用scanf也很糟糕(至少在谷歌看来是这样)。

经过大量的研究,我明白我们应该使用fgets,将输入读入一个字符串,然后解析它。但!没有解释如何正确地清除缓冲区之后。因此,如果我这样做:

代码语言:javascript
复制
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个小时在这个理应简单的技术事情上,仅仅是从用户那里获取输入。解决实际问题更容易..。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-17 22:25:18

不要使用scanf。它让事情变得过于复杂。只需使用getchar读取并丢弃该行即可。例如:

代码语言:javascript
复制
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;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47855955

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档