我正在处理程序,其中向用户显示选项列表,然后他将输入一个整数来指定他想要选择哪个选项。现在我已经抢占了用户可能输入整数值的情况除了有效的。但是如果他输入任何其他值,比如一个字符或一个字符串,程序就会进入一个无限循环,并且无限打印选项列表。我怎么能纠正这个?我的意思是,对于预定义的整数变量,我输入一个不是整数的值时,我应该能够给我的用户一个错误。
任何帮助表示赞赏。这是一个示例代码。
do{
printf("Select appropriate option.\n");
printf("Press 1 to do this");
printf("Press 2 to do that.\n");
printf("Press 3 to exit the program.\n");
scanf("%d",&choice);
if(choice!=1 && choice!=2 && choice!=3)
printf("You entered an invalid choice. Please enter again.\n");
switch(choice){
case 1:
//do this
break
case 2:
//do that
break;
case 3:
exit(1);
}}
while(choice!=3);
所以基本上当用户输入choice
的非整数值时,我希望程序通知用户并要求他提供其他输入。
答案 0 :(得分:1)
使用直接scanf
进行整数变量无法完成。此类scanf
不仅会接受1.23
,还会接受1abcde
和其他输入。 scanf
(和其他转换函数)根据请求的格式尽可能多地读取。当它找到不符合格式要求的东西时,它就会停止,只是让它不受影响。
如果要执行此类分析,则必须将输入读作 string ,然后手动解析并分析该字符串。
C风格的代码草图(因为你坚持使用C风格的代码,尽管已将其标记为[C ++])可能如下所示
char buffer[100]; /* 100 should be enough for everyone :) */
int n = scanf("%s", buffer);
if (n < 1)
/* ERROR, can't read */;
char *end;
long choice = strtol(buffer, &end, 10);
if (end == buffer || *end != '\0' || errno == ERANGE)
/* ERROR, bad format */;
/* ... */
答案 1 :(得分:0)
scanf
时, %d
不会消耗任何非数字。它将返回0
因为它没有转换任何内容,并且“错误输入”仍然在那里等待消耗。您必须以某种方式使用它才能为有效输入做好准备。
(另请注意,在if
进行测试之前,您已将switch
中的3个排除在外)
答案 2 :(得分:0)
scanf
- 请检查返回值 - 即阅读http://linux.die.net/man/3/scanf 答案 3 :(得分:0)
isdigit
将检查任何数字(数字)类型的输入。
对于这包括头ctype.h。
如果输入不正确,也可以使用exit(0)
终止您的程序。
为此包括标题stdlib.h。
#include<ctype.h>
#include<stdlib.h>
char c;
scanf("%c", &c);
if (isdigit(c))
{
case statement...
...
...
}
else
{
printf("Wrong input");
exit(0);
}