在第一次运行,它工作正常。输入字符时,程序运行最后选择的案例
int x;
do{
printf("Input a number:");
scanf("%d", &x);
switch(x){
case 1: printf("A\n\n");
break;
case 2: printf("B\n\n");
break;
case 3: printf("C\n\n");
break;
case 4: printf("End");
break;
default: printf("Invalid.\n");
}
}while(x!=4);
我该如何防止这种情况?
检查scanf
的返回值,如果它没有返回1
,那么你就会知道用户输入了格式说明符不需要的东西或者发生了一些错误。
if(scanf("%d", &x) != 1){
fprintf(stderr,"Error occured\n");
exit(1);
}
更好的解决方案是使用fgets
并使用strtol
解析数字。与scanf
相比,它将对整个过程提供更多的错误处理和控制。
正如我所说,你也可以使用fgets
读取一行,然后使用sscanf
来解析整数输入。玩这个最小功能你会明白我的意思: -
#define MAXLEN 50
int f() {
int v;
char buff[MAXLEN];
while (fgets(buff, sizeof buff, stdin)) {
if (sscanf(buff, "%d", &v) == 1 ) {
return v;
}
}
return -1;
}
输入字符时,程序运行最后选择的案例。
这是因为当scanf("%d", &x);
失败时它没有更新变量x
。 x
still记得最后选择的好号码。
检查标准7.21.6.4 The scanf function。
你可以读一下scanf
here的行为。
成功时,scanf
返回成功读取的项目数。如果发生匹配故障,此计数可以匹配预期的读数或更少,甚至为零。如果在成功读取任何数据之前输入失败,则返回EOF。
知道你可以检查scanf
的返回值并做出适当的决定。在下面的程序中,糟糕的scanf
输入被视为case 4:
并且程序结束:
#include <stdio.h>
int main(){
int x;
do{
printf("Input a number:\n");
if(scanf("%d", &x) != 1){
printf("Error - END.\n");
break;
}
switch(x){
case 1: printf("A\n\n");
break;
case 2: printf("B\n\n");
break;
case 3: printf("C\n\n");
break;
case 4: printf("End\n");
break;
default: printf("Invalid.\n");
}
}while(x!=4);
return 0;
}
输出:
Input a number:
0
Invalid.
Input a number:
1
A
Input a number:
2
B
Input a number:
3
C
Input a number:
N
Error - END.
编辑:
如果OP要求程序在用户输入错误后继续运行,则需要更多工作。天真的方法是用break
取代continue
。
那样不行!任何与格式字符串不匹配的字符都会导致scanf
停止扫描并将无效字符留在缓冲区中!
要继续,我们必须从缓冲区中清除无效字符。
修改后的计划如下:
#include <stdio.h>
#include <ctype.h>
int main(){
int x;
char c;
int error = 0;
do{
c = '0';
if(!error)
printf("Input a number:\n");
else
error = 0;
if(scanf("%d", &x) != 1)
{
printf("No letters! Input a number:\n");
do
{
c = getchar();
}
while (!isdigit(c));
ungetc(c, stdin);
error = 1;
continue;
}
switch(x){
case 1: printf("A\n\n");
break;
case 2: printf("B\n\n");
break;
case 3: printf("C\n\n");
break;
case 4: printf("End\n");
break;
default: printf("Invalid.\n");
}
}while(x!=4);
return 0;
}
输出:
Input a number:
1
A
Input a number:
X
No letters! Input a number:
1
A
Input a number:
4
End