我正在编写一个程序,允许用户输入字母数字字符串并根据可用选项验证他们的输入。当我在下面运行我的代码时,即使我在该范围内输入了一个选项,它总是打印选项无效。任何人都可以帮助我吗?任何帮助都会得到很好的帮助。
#include<stdio.h>
#include<ctype.h>
#include<string.h>
int main (void){
char option;
do{
printf("\n\n----------------------------------------------------\n");
printf("Main Menu\n");
printf("----------------------------------------------------\n");
printf("1. Add Record\n");
printf("2. Delete record\n");
printf("3. List Record\n");
printf("4. Exit\n");
printf("----------------------------------------------------\n");
printf("Enter your option:");
scanf("%c",&option);
if(isdigit(option)){
switch(option){
case 1:
add();
break;
case 2:
del();
break;
case 3:
listrec();
break;
case 4:
return 0;
default:
printf("The number that you have entered is invalid.Please enter a new option\n");
break;
}
else{
printf("The option that you have entered is invalid.Please enter a new option\n");
}
}while(option!=4);
return 0;
}
答案 0 :(得分:2)
除了使用1
而不是'1'
(你需要将字符与字符进行比较,而不是数字),还有另一个问题 - 你没有从输入中获得回车,这使得输入在第二次传递时失败。请参阅下面的可能解决方案:
#include<stdio.h>
#include<ctype.h>
#include<string.h>
int main (void){
char option;
do {
printf("\n\n----------------------------------------------------\n");
printf("Main Menu\n");
printf("----------------------------------------------------\n");
printf("1. Add Record\n");
printf("2. Delete record\n");
printf("3. List Record\n");
printf("4. Exit\n");
printf("----------------------------------------------------\n");
printf("Enter your option:");
if(scanf("%c",&option)==1) {
if(isdigit(option)){
printf("you entered %c\n", option);
switch(option){
case '1':
printf("adding\n");
break;
case '2':
printf("deleting\n");
break;
case '3':
printf("listing\n");
break;
case '4':
return 0;
default:
printf("The number that you have entered is invalid.\nPlease enter a new option:\n");
break;
}
}
else {
printf("you entered not a digit: %c\n", option);
printf("The number that you have entered is invalid.\nPlease enter a new option:\n");
}
// empty the input buffer:
while(getchar()!='\n');
}
}
} while(option!=4);
return 0;
}
有几点需要注意:
}
- 在switch
和else
scanf
是否返回值1
(有效转化)if
之后通过读取清空输入缓冲区,直到我得到EOL
(在scanf
之后保留在缓冲区中)。这确保了下一个字符读取是回车后的下一个字符,而不是回车本身。答案 1 :(得分:1)
包含数字的字符对象的整数值等于表示数字的相应字符的内部表示。例如,如果使用ASCII编码,那么例如'1'的内部表示等于49.所以你必须写
case 49:
而不是
case 1:
通过以下方式更改案例标签,它们不依赖于字符数字的内部表示。
case '1':
add();
break;
case '2':
del();
break;
case '3':
listrec();
break;
case '4':
return 0;
default:
printf("The number that you have entered is invalid.Please enter a new option\n");
break;
}
else{
printf("The option that you have entered is invalid.Please enter a new option\n");
}
}while(option!='4');