【问题标题】:Validating Integer in C在 C 中验证整数
【发布时间】:2012-10-10 07:51:48
【问题描述】:

我正在用 C 创建一个程序,我必须接受一个整数才能继续。我阅读了一些问题以使用以下代码,但我的程序在输入任何字符后不久就会进入无限循环。请帮助我

    int tnum,scancheck;
printf("Enter the number of teams(Maximum 4)\n");
scancheck = scanf("%d",&tnum);
while(scancheck != 1)
{
    printf("ERROR: Please enter numbers only\n\n");
    printf("Enter the number of teams(Maximum 4)\n");
    scancheck = scanf("%d",&tnum);  
}

我使用了基里连科的方法,但我的程序在输入特殊字符时进入无限循环,例如 l=

编辑 问题已解决。谢谢大家

【问题讨论】:

    标签: c validation input integer validating


    【解决方案1】:

    如果您希望从用户那里获得输入,请获取该行并对其进行分析。

    char   line[1024];
    char * err = NULL;
    int    num;
    
    while( err == NULL || *err )
    {
       fgets( stdin, line );
       num = strtol( line, &err, 10 );
    }
    

    直到满足要求为止。

    【讨论】:

    • 不要只发布一段代码,请解释为什么这段代码可以解决所提出的问题。没有解释,这不是答案。
    【解决方案2】:

    如果输入无效,Scanf 会将字符放回标准输入流。因为,我们没有清除标准输入流,它正在走向一个无限循环。

    试着在你的 scanf 语句下面写这个

    fflush(stdin);
    

    【讨论】:

    • 它对我有用!!非常感谢兄弟。这里是帮助最快的社区之一
    • 正如@Kirilenko 已经指出的那样,刷新标准输入是未定义的行为。您应该使用 getchar 或 scanf("%*c") 手动清空缓冲区。
    • 是的..我正在使用基里连科的方法。无论如何,谢谢你的建议
    • 同意。我只是想给出一个不同于已经给出的解决方案。 :)
    【解决方案3】:

    您必须在调用scanf 之间清理stdin。否则scanf 带有无效输入的行为是将字符放回流中。然后,它进入一个无限循环,每次迭代都读取相同的错误字符。

    #include <stdio.h>
    
    void clean_stdin(void) {
        int c;
        while ((c = getchar()) != '\n' && c != EOF)
            ;
    }
    
    /* ... */
    
    int ret;
    int n;
    
    do {
       ret = scanf("%d", &n);
       clean_stdin();
    } while (ret != 1);
    

    【讨论】:

    • 你能告诉我标准输入是什么吗?
    • 是输入流(读取this)。
    • 谢谢,我知道了。非常感谢
    • 我正在使用 fflush(stdin);现在有什么问题吗
    • fflush(stdin) 是一个非常糟糕的主意:在输入流(例如stdin)上使用fflush 是一种未定义的行为。例如,GNU 在这种情况下的行为是什么都不做。
    猜你喜欢
    • 2014-01-21
    • 2011-09-27
    • 2012-11-02
    • 1970-01-01
    • 1970-01-01
    • 2019-06-02
    • 2021-12-21
    • 2013-02-20
    • 2014-01-21
    相关资源
    最近更新 更多