检查C中的任何输入是否为非整数

时间:2015-08-08 06:22:34

标签: c

这里有一个类似的问题(这个问题的基础)

Check if input is integer type in C及相关回答https://stackoverflow.com/a/4072483/3395716

不同之处在于,在该答案中只检查了一个整数,但我想检查多个数字然后退出。

我修改了这个程序,

//variable declaration
flag=0;
    if(scanf("%d%c", &A, &term) != 2 || term != '\n')
    {
        flag=1;
    }
    if(scanf("%d%c",&B, &term) != 2 || term != '\n')
    {
        flag=1;
    }
    if(scanf("%d%c",&C,&term) != 2 || term != '\n')
    {
       flag=1;
    }
    if(flag==1)
    {
        printf("failure\n");
        return 0;
    }

问题是,程序不会等待所有数字被输入,而是如果第一个输入无效,它只会打印failure

我该怎么办?

编辑: 示例输入和输出

5
6
7
output:nothing

预期

input:
5
f
7
output:failure

会发生什么

5
f
output:failure

3 个答案:

答案 0 :(得分:3)

问题是如果输入无效,scanf函数将读取输入,它将留在输入缓冲区中,用于下一个输入函数,案例将以相同的输入失败。

我建议您使用例如fgets阅读整行,然后使用例如sscanf(或strtol)将字符串转换为数字。

答案 1 :(得分:1)

问题在于:如果用户输入A并按Enter键,则第一个scanf会失败,因为它会看到A,但是A保留在输入流中。因此,第二个和第三个scanf也会看到A并立即失败。

通常,如果您需要强制执行面向行的协议,则应使用fgets读取一行,并使用sscanf和/或strto*系列函数进行转换。

答案 2 :(得分:0)

scanf("%d ... 读取无效字符'f',但看到它不是int的预期部分(因为"%d" }),取消角色,将其重新放回stdin进行后续阅读/扫描。

因此,在某些内容消耗'f'之前,使用scanf("%d%c", ...的其他来电不会改变事物的状态。

最好使用fgets()(C标准)或getline()(常见,但不是标准)来阅读用户输入。