在C中读取整数后,在while循环

时间:2015-12-08 20:39:05

标签: c while-loop scanf

我有一段代码,我检查scanf的输入是否有效。即如果scanf返回非零正数。这是我的代码的一部分:

while(scanf(" %d",&choice)<=0){
        printf("Incorrect value entered, please re-enter\n");
    }

其中“choice”是整数。

每次运行此代码时,编译器都会在执行while循环后跳过scanf。我得到这样的输出:

欢迎来到捕食者/猎物计算器

请输入您的姓名

丹 嗨丹

请选择以下选项之一:     1.计算典型捕食者和猎物系统的演变     2.计算特定捕食者和猎物系统的演变     3.计算CUSTOM捕食者和猎物系统的演变     0.退出 一个 输入的值不正确,请重新输入 输入的值不正确,请重新输入 输入的值不正确,请重新输入 输入的值不正确,请重新输入 输入的值不正确,请重新输入 输入的值不正确,请重新输入 输入的值不正确,请重新输入 输入的值不正确,请重新输入 输入的值不正确,请重新输入 输入的值不正确,请重新输入 输入的值不正确,请重新输入 输入的值不正确,请重新输入 输入的值不正确,请重新输入 输入的值不正确,请重新输入 输入的值不正确,请重新输入

输入的值不正确,请重新输入

你能解释一下为什么会这样吗?我似乎无法在互联网上找到任何有关整数阅读的答案。

非常感谢,

3 个答案:

答案 0 :(得分:3)

您的代码存在的问题是,如果用户没有输入数字,您的程序将永远循环。这是因为scanf将反复尝试解析相同的字符串并继续失败。 你要做的就是匹配用户写的任何内容,然后再次询问一个数字:

#include<stdio.h>

int main(){
    int choice;
    while(scanf("%d",&choice) <= 0){
        scanf("%*s"); // this will parse anything the user has written
        printf("Incorrect value entered, please re-enter\n");
    }
    return 0;
}

scanf格式字符串中的*是分配抑制字符,来自scanf手册页:

  

&#39; *&#39;赋值抑制字符:scanf()读取输入   按照转换规范的指示,但丢弃                 输入。不需要相应的指针参数,并且此规范不包括在计数中   成功                 scanf()返回的赋值。

答案 1 :(得分:0)

编辑第一个抱怨是scanf()返回成功转换的字段数。下一个问题是scanf在输入中留下未转换的字符,并将尝试再次转换这些相同的字符。输入duff后,您可以清除输入:

#include <stdio.h>

#define MAXCHOICE 42

int main(void)
{
    int choice, ch;
    while(scanf("%d",&choice) != 1 || choice < 1 || choice > MAXCHOICE){
        printf("Incorrect value entered, please re-enter\n");
        while((ch = getchar(stdin)) != '\n');     // clear the input
    }
    printf("Choice %d\n", choice);
    return 0;
}

计划会议:

100
Incorrect value entered, please re-enter
a
Incorrect value entered, please re-enter
5
Choice 5

答案 2 :(得分:0)

可能这就是你所需要的:

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

int main(void){
    int choice,repeat = 0;

    do{
        printf("Give a Number: ");
        if((scanf("%d",&choice)) != 1){
            printf("ErrorFix it!\n");
            exit(1);
        }else{
            if(choice > 0){
                printf("OK\n");
                repeat = 0;
            }else{
                printf("Incorrect value entered, please re-enter\n");
                repeat = 1;
            }
        }
    }while(repeat == 1);

    printf("Your typed %d\n",choice);
    return 0;
}

输出:

Give a Number: 0
Incorrect value entered, please re-enter

Give a Number: -5
Incorrect value entered, please re-enter

Give a Number: 10
OK
Your typed 10