我有一段代码,我检查scanf的输入是否有效。即如果scanf返回非零正数。这是我的代码的一部分:
while(scanf(" %d",&choice)<=0){
printf("Incorrect value entered, please re-enter\n");
}
其中“choice”是整数。
每次运行此代码时,编译器都会在执行while循环后跳过scanf。我得到这样的输出:
欢迎来到捕食者/猎物计算器
请输入您的姓名
丹 嗨丹
请选择以下选项之一: 1.计算典型捕食者和猎物系统的演变 2.计算特定捕食者和猎物系统的演变 3.计算CUSTOM捕食者和猎物系统的演变 0.退出 一个 输入的值不正确,请重新输入 输入的值不正确,请重新输入 输入的值不正确,请重新输入 输入的值不正确,请重新输入 输入的值不正确,请重新输入 输入的值不正确,请重新输入 输入的值不正确,请重新输入 输入的值不正确,请重新输入 输入的值不正确,请重新输入 输入的值不正确,请重新输入 输入的值不正确,请重新输入 输入的值不正确,请重新输入 输入的值不正确,请重新输入 输入的值不正确,请重新输入 输入的值不正确,请重新输入
你能解释一下为什么会这样吗?我似乎无法在互联网上找到任何有关整数阅读的答案。
非常感谢,
答案 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