【问题标题】:using scanf to enter integers only? [duplicate]使用 scanf 只输入整数? [复制]
【发布时间】:2017-04-18 20:30:33
【问题描述】:

我一直在编写一个需要整数输入的程序,但每次意外输入非整数时,scanf 函数都会停止工作或陷入循环。

这是我尝试做的一个例子:

    int n;
    printf("please enter 0 or 1\n");
top:
    scanf("%i",&n);
    if(n == 0)
    {
        printf("you entered 0!\n");
    }
    if(n == 1)
    {
        printf("you entered 1!\n");
    }
    if(n != 0 && n != 1)
    {
        printf("please enter either 0 or 1.");
        goto top;
    }

第三个 if 是如果您没有输入正确的数字,则将您送回顶部,但这不适用于字母和其他字符。 如果给定非整数输入,如何将其发送回顶部?

【问题讨论】:

  • 通过输入fgets 并应用sscanf 并检查其返回值来躲避它(研究手册页:scanf family 的函数返回值是什么?)。如果你没有得到你想要的,转储输入字符串并得到另一个。
  • "如果给定非整数输入,如何将其发送回顶部?" --> 读取非整数并先将其丢弃。
  • 您应该检查scanf() 的返回值以识别何时发生错误,例如输入不是数字。当发生这种匹配失败时,您必须从标准输入中读取至少一个字符——scanf() 目前正在阻塞——否则它将留在原处,在下次尝试时造成麻烦。
  • 虽然它有它的用途,但 goto 这里只是糟糕的编码风格。使用循环!

标签: c integer scanf


【解决方案1】:

这可以通过将scanf("%i",&n); 调用替换为以下内容来解决:

char buffer[256];
char *s = fgets(buffer, 256, stdin);

if (s != buffer)
{
    // Some error occurred
    goto top;
}

int error = sscanf(buffer, "%i", &n);

if (error == 0)
{
    // The string read is not a number!
    printf("please enter either 0 or 1.");
    goto top;
}

【讨论】:

    【解决方案2】:

    试试这个

    #include <stdio.h>
    
    int main(void){
        int n;
        printf("please enter 0 or 1\n");
    
        for(;;){
            int status;
            char ch;
            status = scanf("%i%c", &n, &ch);//check return value of scanf, ch : for check rest input
            if(status == EOF){
                printf("Bye!!\n", n);
                return 0;
            } else if(status == 2 && ch == '\n'){
                if(n == 0 || n == 1){
                    printf("you entered %i!\n", n);
                    break;
                }
            } else {
                while(getchar() != '\n');//clear input
            }
            printf("please enter either 0 or 1.\n");
        }
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-19
      • 1970-01-01
      • 2021-05-15
      • 1970-01-01
      • 2013-10-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多