C++程序问题,请大虾解答.为啥非法输入是数字这个程序正常,但是是字母之类非法输入就死循环!?该咋改?

#include <iostream>
using namespace std;
typedef void (*MenuFun)();
void f1(){cout<<"good!\n";}
void f2(){cout<<"better!\n";}
void f3(){cout<<"best!\n";}
int main()
{
MenuFun fun[]={f1,f2,f3};
for(int choice=1; choice; )
{
cout<<"1--------display good.\n"
<<"2--------display better.\n"
<<"3--------display best.\n"
<<"0--------exit.\n"
<<"Enter your choice:";
cin>>choice;
switch(choice)
{
case 1:fun[0](); break;
case 2:fun[1](); break;
case 3:fun[2](); break;
case 0:return 0;
default:cout<<"you entered a wrong key.\n";
}
}
}

死循环?程序还会响应你的输入吗?如果能响应,你这时再输入0程序能不能正常退出?
如果能正常退出,说明程序没有问题,是对的。因为你其它的非法输入所对应的ASCII码基本都不会是1,2,3,0,比如说大写字母好像是从65还是67开始的,小写字母是从97开始的,这些非0数在for循环中做条件判断时都是被认为是真值,所以会一直进循环 。
要想实现你的意图,要么把choice改成char型,要么就自己做一下数字校验,对非法输入做出提示
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-09-19
把choice换成char型就可以了

#include <iostream>
using namespace std;
typedef void (*MenuFun)();
void f1(){cout<<"good!\n";}
void f2(){cout<<"better!\n";}
void f3(){cout<<"best!\n";}
int main()
{
MenuFun fun[]={f1,f2,f3};
for(char choice='1'; choice; )
{
cout<<"1--------display good.\n"
<<"2--------display better.\n"
<<"3--------display best.\n"
<<"0--------exit.\n"
<<"Enter your choice:";
cin>>choice;
switch(choice)
{
case '1':fun[0](); break;
case '2':fun[1](); break;
case '3':fun[2](); break;
case '0':return 0;
default:cout<<"you entered a wrong key.\n";
}
}
}追问

知道了。
当cin尝试将输入的字符读为int型数据失败后,会产生一个错误状态--cin.fail().而要用cin读取输入流中的数据,输入流必须处于无错误状态。因此,由于错误状态的存在,会一直执行循环。

第2个回答  2012-09-19
顶楼上
第3个回答  2012-09-19
你上面定义的choice不是整型吗,你输入字符干嘛??

C++程序问题,请大虾解答.为啥非法输入是数字这个程序正常,但是是字母之 ...
如果能正常退出,说明程序没有问题,是对的。因为你其它的非法输入所对应的ASCII码基本都不会是1,2,3,0,比如说大写字母好像是从65还是67开始的,小写字母是从97开始的,这些非0数在for循环中做条件判断时都是被认为是真值,所以会一直进循环 。要想实现你的意图,要么把choice改成char型,要么就...

c++关于键入数字和字母的问题
如果你的程序能运行话 那么解决这个问题只要将 n的输入进行判断就行。所以 在输入n之后 即 \/*if((n>='a'&&n<='z')||(n>='A'&&n<='Z')){cout<<"请输入正确的数字"<<endl;cin>>n;的注解 用while((n>='a'&&n<='z')||(n>='A'&&n<='Z')){cout<<"请输入正确的数字...

各位大虾好!我的C++程序处理的数据很大,总是出现0xC0000005: Access Vi...
2、操作系统分配给应用程序的空间 有一部分地址空间被系统占用,应用程序无法使用,所以实际用户程序的程序空间大概是两个多GB,估摸着你什么地方还有其他的东西?所以一不小心就超过了这个上限。3、解决办法 使用磁盘的空间,对数据进行分批处理,最后把结果合并(当然是依次写入文件)。有问题直接评论即可。

新手在关于C++程序中指针编程中遇到一问题,求各位大虾不吝赐教...
student.p[0]=head; 这一句有问题,应是 p[0] = head;另外,请将报错内容贴上 应该就是上面一句的问题,你改后试试

C\/C++语言中,在不确定用户输入数据个数的情况下来控制循环结束?_百度...
可以参考下面的代码:int main(){ int a[100],i=0,ch=0;printf("请输入一组整形数据(不超过100个):");do{ scanf("%d",&a[i++]);ch=getchar();}while(ch!='\\n');for(ch=0;ch

C++万年历问题->急!!!下面程序到底哪出错了?请各位大虾帮忙……_百度...
include<math.h> void printmonth(int m);void printhead(int m);int daysofmonth(int m);int firstday(int y);int year,weekday;int main(){ int i;printf("请输入年份: ");scanf("%d",&year);weekday=firstday(year);printf("\\n\\n");printf(" %d年\\n",year);for(i=1;i...

内存老是出现如下对话框,请问各位大虾该如何解决?
3、劣质内存条也会出现这个问题 4、微软WINDOWS系统的漏洞,windows把内存地址0X00000000到0X0000ffff指定为分配null指针的地址范围,如果程序试图访问这一地址,则认为是错误。c\/c++编写的程序通常不进行严格的错误检查,当采用malloc来分配内存而可供分配的地址空间不够的情况下返回null指针。但是代码不检查...

c++运行时,我输入数据,但是不小心按了enter键出现了一个空行,请问各位...
这个时候不用删,,你继续输入你的数据就好了。。 c++会跳过你打的换行的

"0x6945f613"指令引用的"0x00000000"内存。该内存不能为"written"_百 ...
该内存不能为“written”,要终止程序,请单击“确定”,而在Windows 98里运行却正常。 解决方法:这可能是系统的兼容性问题,winXP的系统,右键“AutoRun.exe”文件,属性,兼容性,把“用兼容模式运行这个程序”项选择上,并选择“Windows 98\/Me”。win2000如果打了SP的补丁后,只要开始,运行,输入:regsvr32 c:\\\\winnt\\...

...0x83cd5020,0x83cd5194,0x80923160)求助,求救大虾帮忙
c\/c++编写的程序通常不进行严格的错误检查,当采用malloc来分配内存而可供分配的地址空间不够的情况下返回null指针。但是代码不检查这种错误,认为地址分配已经成功,于是就访问0X00000000的地址,于是就发生内存违规访问,同时该进程被终止。ASCII字符填充组成的pif文件时会出现以下情况:一个非法的pif文件(用...

相似回答