scanf在C中不是很宽容

时间:2012-11-20 01:24:16

标签: c scanf

在下面的代码中,我希望给用户一个选项,输入'e'来退出代码并查看结果,而不是目前代码中使用的100。但是代码无法从终端使用'e'正常运行,因为scanf需要一个整数,与声明的类型匹配。如果我输入任何字符而不是整数,scanf会以某种方式将其存储在变量中。这种方式固定了吗?如果它是固定的,我可以使用该存储的值来检查是否退出程序吗?

#include<stdio.h>
int main(void)
{
    int rating[11], x;

    for (int a = 0; a <= 11; a++)
        rating[a] = 0;

    while (1){
        printf("key in 100 to see the results\n");
        printf("Enter the rating on a scale from 1 to 10 ?");
        scanf("%i", &x);

        if ((x < 1 || x > 10) && x != 100)
            printf("bad entry ! \n");

        if (x == 100){
            printf("\nRatings..............No of responses\n");
            for (int y = 1; y <= 10; y++)
                printf("%2i.......................%2i\n", y, rating[y]);
            return 0;
        }

        rating[x]++;
    }
}

1 个答案:

答案 0 :(得分:2)

scanf返回成功读取的项目数(或出错时为-1)。所以,你可以想象一下,看看scanf是否返回0,并在那种情况下保释;如果输入任何非数字,它将退出程序。

如果您特别想要查看'e',最好的选择是fgets整行输入,使用strcmp检查您的特殊情况,然后使用{{1}获得一个整数。