检测是否仅给出整数的程序进入无限循环

时间:2018-10-13 17:59:42

标签: c scanf goto

// program to detect whether only integer has been given or not
int main() {
    int a, b, s; 
    printf("Enter two proper number\n");
 BEGIN:
    s = scanf("%d %d", &a, &b); //storing the scanf return value in s
    if (s != 2) {
        printf("enter proper value\n");
        goto BEGIN;
    }
    printf("The values are %d and %d ", a, b);
}

此程序用于检测在输入无效数据而不是要求新值时是否仅给出整数而进入无限循环 goto为什么在这里不起作用?

3 个答案:

答案 0 :(得分:1)

请注意,当scanf输入错误(例如,输入 cat dog )时,该输入将保留在输入缓冲区中,直到您采取措施将其清除为止。因此,循环会不断重复并拒绝仍然存在的相同输入。

使用fgetssscanf更简单,如果扫描失败,您只需忘记输入字符串并得到另一个即可。

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int a, b;
    char str[42];
    do {
        printf("Enter 2 numeric values\n");
        if(fgets(str, sizeof str, stdin) == NULL) {
            exit(1);
        }
    } while(sscanf(str, "%d%d", &a, &b) != 2);
    printf("Numbers are %d and %d\n", a, b);
}

计划会议:

Enter 2 numeric values
cat dog
Enter 2 numeric values
cat 43
Enter 2 numeric values
42 dog
Enter 2 numeric values
42 43
Numbers are 42 and 43

请注意,goto在C语言中是较差的做法,应仅在没有其他构造代码的方式(通常是这种方式)的情况下使用。

答案 1 :(得分:1)

scanf()返回不同于2的值有多种原因:

  • 存在无法根据转换规范转换的待处理输入。例如,如果输入流中有一个A待处理,则%d转换将失败,并且A会保留在输入流中。您的代码只会继续尝试此转换,并且永远不会停止。重试之前,您应该阅读并丢弃有问题的输入。
  • 输入流发生读取错误或到达文件末尾。如果至少一次转换成功,则返回成功转换的次数,否则返回EOF。如果返回EOF,则没有任何必要再次尝试,因为没有更多输入可用。
  • 还请注意,对于gotowhile等流控制语句更好地表示的结构,使用for被认为是不好的风格。

这是更正的版本:

#include <stdio.h>

// program to detect whether only integer has been given or not
int main() {
    int a, b, s, c;

    printf("Enter two proper numbers: ");
    for (;;) {
        s = scanf("%d%d", &a, &b); //storing the scanf return value in s
        if (s == 2) // conversions successful
            break;
        if (s == EOF) {
            printf("unexpected end of file\n");
            return 1;
        }
        /* discard the rest of the input line */
        while ((c = getchar()) != EOF && c != '\n')
            continue;
        printf("Invalid input. Try again: ");
    }
    printf("The values are %d and %d\n", a, b);
    return 0;
}

答案 2 :(得分:0)

scanf返回字符数。结果,s将等于您写入的字符数为2,然后您的 loop 将停止。无限次运行的原因是您输入的字符数与2不同。请打印s以查看其拥有什么值,您将获得更多信息。