Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如果输入不是整数,尝试避免无限循环_C - Fatal编程技术网

C 如果输入不是整数,尝试避免无限循环

C 如果输入不是整数,尝试避免无限循环,c,C,更新如下 我需要测试一个输入是否是一个整数,它是否是一个整数,然后继续做一些事情 如果输入不是整数,我需要打印一条错误消息并退出 我使用的方法是scanf将返回读取的项目数,在我的情况下,我希望它返回1。因此,我测试scanf是否返回1,并执行其余代码 但是,由于某种原因,当scanf没有返回1时,我遇到了一个无限循环 代码: 此问题的最佳解决方案是使用fgets()读取输入,然后使用sscanf()解析输入,但得到无限循环的原因是:您的测试不正确: while (flag = scanf("%

更新如下

我需要测试一个输入是否是一个整数,它是否是一个整数,然后继续做一些事情

如果输入不是整数,我需要打印一条错误消息并退出

我使用的方法是
scanf
将返回读取的项目数,在我的情况下,我希望它返回1。因此,我测试
scanf
是否返回1,并执行其余代码

但是,由于某种原因,当
scanf
没有返回
1
时,我遇到了一个无限循环

代码:


此问题的最佳解决方案是使用
fgets()
读取输入,然后使用
sscanf()
解析输入,但得到无限循环的原因是:您的测试不正确:

while (flag = scanf("%d", &expected) != EOF)
flag
接收
scanf
EOF
的返回值之间的比较结果。。。你可能想写这个:

while ((flag = scanf("%d", &expected)) != EOF)
但是,如果用户键入了无法解析为
int
的内容,则此类输入将停留在
stdin
缓冲区中,
scanf()
将继续徒劳地尝试解析它

尝试以下方法:

#include <stdio.h>

int getnumber(int *valp) {
    char line[80];
    char last;

    while (fgets(line, sizeof line, stdin)) {
        flag = sscanf(line, "%d %c", &expected, &last);
        if (flag < 1) {
            printf("Input is not a number: %s", line);
            continue;
        }
        if (flag > 1) {
            printf("Extra characters after number input: %s", line);
            continue;
        }
        return 0;
    }
    return EOF;
}

int main(void) {
    int expected;
    int count;
    double sum;
    int value;

    while (getnumber(&expected) != EOF) {
        sum = 0;
        for (count = 0; count < expected; count++) {
            if (getnumber(&value) == EOF) {
                printf("Error! Can't read number of expected values.\n");
                break;
            }
            sum += value;
        }
        printf("Average of %d values is %.2f\n",
               count, count != 0 ? sum / count : 0.0);
    }
    return 0;
}
#包括
int getnumber(int*valp){
字符行[80];
炭末;
而(fgets(生产线、生产线尺寸、标准尺寸)){
标志=sscanf(第%d%c行,预期和最后一行);
如果(标志<1){
printf(“输入不是一个数字:%s”,第行);
继续;
}
如果(标志>1){
printf(“数字输入后的额外字符:%s”,第行);
继续;
}
返回0;
}
返回EOF;
}
内部主(空){
int预期值;
整数计数;
双和;
int值;
while(getnumber(&预期)!=EOF){
总和=0;
对于(计数=0;计数<预期值;计数++){
if(getnumber(&value)==EOF){
printf(“错误!无法读取预期值的数目。\n”);
打破
}
总和+=数值;
}
printf(“%d个值的平均值为%.2f\n”,
计数,计数!=0?总和/计数:0.0);
}
返回0;
}

请注意
flag=scanf(“%d”和预期值)!=EOF
相当于
标志=(scanf(“%d”和预期值)!=EOF)
。也许不是你想要的?还要注意,如果您输入一个非整数,那么将返回
0
而不是
EOF
。您必须找到一种方法来刷新输入缓冲区,否则程序将继续尝试读取
小数点或其他任何内容。但是我会输入<代码> fgs<代码>,然后应用<代码> sSCANF,这样您就可以很容易地将其余的输入转储。最后,您可能需要考虑使用和<代码> sSCANF。添加一个<代码>破解< /代码>;进入
else
scope@Someprogrammerdude我懂了。。所以我应该在另一个if语句中测试标志是否为EOF吗?我现在就试试……谢谢你的输入,我现在知道测试写得有多不正确了。函数fgets()和strtol()不是我们可以使用的。这是一门C入门课程,讲师明确表示只使用我们在课堂上学习过的函数(在这个特殊问题中,额外的条件是不使用连续中断语句),我知道这些参数看起来不现实,不必要,但事实就是这样…@StephenCadiz:if
scanf()
返回0,您必须处理有问题的输入并跳过它。一个简单的方法是
scanf(“%*s”)
将读取并丢弃一系列非空白字符
scanf()
非常古怪,容易被误用,是软件缺陷的常见来源。很遗憾,它仍然是初学者在学习C语言时看到和使用的第一个库函数。感谢您编写这段代码,我不得不查找一些函数,但我想我可以按照您的思路进行。进一步阅读证实了您关于scanf的陈述,有整篇文章详细说明了为什么不应该使用它。。。唉,目前我能读取输入的只有scanf和getchar@chqrlie@StephenCadiz:使用
scanf()
的一个典型问题是使用
%s
转换说明符:除非您完全控制输入,否则这与使用臭名昭著的
get()
函数一样糟糕:足够长的输入字符串将导致缓冲区溢出。查看您的课程是否对此发出警告,并建议使用长度说明符将输入限制为小于目标数组的大小:
char buf[20];n=scanf(“%19s”,buf)
while ((flag = scanf("%d", &expected)) != EOF)
#include <stdio.h>

int getnumber(int *valp) {
    char line[80];
    char last;

    while (fgets(line, sizeof line, stdin)) {
        flag = sscanf(line, "%d %c", &expected, &last);
        if (flag < 1) {
            printf("Input is not a number: %s", line);
            continue;
        }
        if (flag > 1) {
            printf("Extra characters after number input: %s", line);
            continue;
        }
        return 0;
    }
    return EOF;
}

int main(void) {
    int expected;
    int count;
    double sum;
    int value;

    while (getnumber(&expected) != EOF) {
        sum = 0;
        for (count = 0; count < expected; count++) {
            if (getnumber(&value) == EOF) {
                printf("Error! Can't read number of expected values.\n");
                break;
            }
            sum += value;
        }
        printf("Average of %d values is %.2f\n",
               count, count != 0 ? sum / count : 0.0);
    }
    return 0;
}