以下是一段代码,前面的不重要,关键是最后的switch语句部分,当我执行时,一输入英文就 死循环,输数字就不会,各位亲们,帮看下是什么原因?以前有查过,百度一下说是要清缓存,我按他们说的做了,都不会成功,有人说就加一条代码就可以,具体我不知道怎么弄。请多多指教。
#include "stdio.h"
#include "iostream.h"
struct zuoye{
int arrayTime;
int serveTime;
}data[5];
void main(){
int n=0,x;
while(n<5)
{
data[n].arrayTime=n;data[n++].serveTime=4;
data[n].arrayTime=n;data[n++].serveTime=3;
data[n].arrayTime=n;data[n++].serveTime=5;
data[n].arrayTime=n;data[n++].serveTime=2;
data[n].arrayTime=n;data[n++].serveTime=4;
}
//赋值测试
/*for(n=0;n<5;n++)
printf("%d %d\n",data[n].arrayTime,data[n].serveTime);*/
cout<<endl<<endl<<endl<<" ^_^***********JH***********欢迎使用JH人软件************JerryHu*********^_^ "<<endl<<endl;
cout<<" no1:FCFS举例,请按1;"<<endl;
cout<<" no2:SJF举例,请按2;"<<endl;
cout<<" no3:HRN举例,请按3;"<<endl;
cout<<" no4:退出,请按4;"<<endl;
cin>>x;
switch(x){
case 1:cout<<"FCFS\n";main();
case 2:cout<<"SJF\n";main();
case 3:cout<<"HRN\n";main();
case 4:cout<<"感谢使用!";break;
default:if(x>4)cout<<"输入错误,请重新输入。\n\n";main();
}
12 个解决方案
#1
看看。。。
#2
补充一下,程序是用VC++6.0编译调试的。
#3
default:
cin.sync();//清除缓冲区
cin.clear();//清除错误状态
如果没有上述两行代码,则错误的输入会一直保留在缓冲区中,且cin处于关闭状态
LZ的代码中,缓冲区中的值一直为0,当然是死循环啦!!
cin.sync();//清除缓冲区
cin.clear();//清除错误状态
如果没有上述两行代码,则错误的输入会一直保留在缓冲区中,且cin处于关闭状态
LZ的代码中,缓冲区中的值一直为0,当然是死循环啦!!
#4
我用dev c++调试几次,其中发现问题:
1、程序在case语句中用的是调用main()函数,就算你输入的是都是正确的数字,只要多次运行就变成了近似无限递归调用main,栈的资源估计很快就回消耗殆尽,离程序崩溃也就不远了。
2、出现死循环的原因是当不正确的输入后,程序运行完default:if(x>4)cout<<"输入错误,请重新输入。\n\n";main();然后按照逻辑应该是cin>>x,但是这个时候这个语句根本不会执行,直接就跳过去判断,然后又回到这里,去判断。。。这就是死循环的原因。开始我以为是变量x的作用域的原因,改为全局变量也不行,那个cin》x语句死活不执行。在dev c++中输入错误的时候,例如字母“a”,x变为148,硬是没弄明白。这个坐等大牛解释。
顺便吐槽一下,dev c++的调试功能真是弱爆了!!!!其中不知道重启了dev c++多少次。。。
1、程序在case语句中用的是调用main()函数,就算你输入的是都是正确的数字,只要多次运行就变成了近似无限递归调用main,栈的资源估计很快就回消耗殆尽,离程序崩溃也就不远了。
2、出现死循环的原因是当不正确的输入后,程序运行完default:if(x>4)cout<<"输入错误,请重新输入。\n\n";main();然后按照逻辑应该是cin>>x,但是这个时候这个语句根本不会执行,直接就跳过去判断,然后又回到这里,去判断。。。这就是死循环的原因。开始我以为是变量x的作用域的原因,改为全局变量也不行,那个cin》x语句死活不执行。在dev c++中输入错误的时候,例如字母“a”,x变为148,硬是没弄明白。这个坐等大牛解释。
顺便吐槽一下,dev c++的调试功能真是弱爆了!!!!其中不知道重启了dev c++多少次。。。
#5
这么说是cin的原因了,我添加后一样没有作用,我开始把cin改为了scanf就不行啊。继续等大牛!
#6
不好意思,看错了。cin.sync();cin.clear()不加到那个default里面,加到cin》x前面成功了。
#7
我按你们说的做了,我把cin.sync();cin.clear(),加到default后或者是cin前,结果用VC6编译后,执行时输入英文字母时还是会出现死循环,按照3L说的,是不是当输入错误的数字时,缓存区就会自动释放,而输入英文字母的话,缓存区就不会释放,所以造成死循环呢?求解决方法。。
#8
cin 出错,类型不匹配。。 输入缓冲区异常, 重新定位。。。 cin.sync();cin.clear()。。。
干嘛一定要用int去接受, 然后再输入字符, 这不是自寻死路吗?? 改为全接受字符不久OK了, 搞不懂你。。
干嘛一定要用int去接受, 然后再输入字符, 这不是自寻死路吗?? 改为全接受字符不久OK了, 搞不懂你。。
#9
建议 int x; 改为 CString x;试试
#10
参考:
struct zuoye{
int arrayTime;
int serveTime;
}data[5];
int main()
{
int n=0,x;
while(n<5)
{
data[n].arrayTime=n;data[n++].serveTime=4;
data[n].arrayTime=n;data[n++].serveTime=3;
data[n].arrayTime=n;data[n++].serveTime=5;
data[n].arrayTime=n;data[n++].serveTime=2;
data[n].arrayTime=n;data[n++].serveTime=4;
}
cout<<endl<<endl<<endl<<" ^_^***********JH***********欢迎使用JH人软件************JerryHu*********^_^ "<<endl<<endl;
cout<<" no1:FCFS举例,请按1;"<<endl;
cout<<" no2:SJF举例,请按2;"<<endl;
cout<<" no3:HRN举例,请按3;"<<endl;
cout<<" no4:退出,请按4;"<<endl;
cin>>x;
cin.clear();
cin.sync();
cout << x << endl;
switch(x)
{
case 1:
cout<<"FCFS\n";
main();
break;
case 2:cout<<"SJF\n";
main();
break;
case 3:cout<<"HRN\n";
main();
break;
case 4:cout<<"感谢使用!";
break;
default:
if(x > 4 || x < 0)cout<<"输入错误,请重新输入。\n\n";
main();
break;
}
return 0;
}
#11
加一个判断是不是字符就好了,不然输入是字符的话一直都跳不出switch
#1
看看。。。
#2
补充一下,程序是用VC++6.0编译调试的。
#3
default:
cin.sync();//清除缓冲区
cin.clear();//清除错误状态
如果没有上述两行代码,则错误的输入会一直保留在缓冲区中,且cin处于关闭状态
LZ的代码中,缓冲区中的值一直为0,当然是死循环啦!!
cin.sync();//清除缓冲区
cin.clear();//清除错误状态
如果没有上述两行代码,则错误的输入会一直保留在缓冲区中,且cin处于关闭状态
LZ的代码中,缓冲区中的值一直为0,当然是死循环啦!!
#4
我用dev c++调试几次,其中发现问题:
1、程序在case语句中用的是调用main()函数,就算你输入的是都是正确的数字,只要多次运行就变成了近似无限递归调用main,栈的资源估计很快就回消耗殆尽,离程序崩溃也就不远了。
2、出现死循环的原因是当不正确的输入后,程序运行完default:if(x>4)cout<<"输入错误,请重新输入。\n\n";main();然后按照逻辑应该是cin>>x,但是这个时候这个语句根本不会执行,直接就跳过去判断,然后又回到这里,去判断。。。这就是死循环的原因。开始我以为是变量x的作用域的原因,改为全局变量也不行,那个cin》x语句死活不执行。在dev c++中输入错误的时候,例如字母“a”,x变为148,硬是没弄明白。这个坐等大牛解释。
顺便吐槽一下,dev c++的调试功能真是弱爆了!!!!其中不知道重启了dev c++多少次。。。
1、程序在case语句中用的是调用main()函数,就算你输入的是都是正确的数字,只要多次运行就变成了近似无限递归调用main,栈的资源估计很快就回消耗殆尽,离程序崩溃也就不远了。
2、出现死循环的原因是当不正确的输入后,程序运行完default:if(x>4)cout<<"输入错误,请重新输入。\n\n";main();然后按照逻辑应该是cin>>x,但是这个时候这个语句根本不会执行,直接就跳过去判断,然后又回到这里,去判断。。。这就是死循环的原因。开始我以为是变量x的作用域的原因,改为全局变量也不行,那个cin》x语句死活不执行。在dev c++中输入错误的时候,例如字母“a”,x变为148,硬是没弄明白。这个坐等大牛解释。
顺便吐槽一下,dev c++的调试功能真是弱爆了!!!!其中不知道重启了dev c++多少次。。。
#5
这么说是cin的原因了,我添加后一样没有作用,我开始把cin改为了scanf就不行啊。继续等大牛!
#6
不好意思,看错了。cin.sync();cin.clear()不加到那个default里面,加到cin》x前面成功了。
#7
我按你们说的做了,我把cin.sync();cin.clear(),加到default后或者是cin前,结果用VC6编译后,执行时输入英文字母时还是会出现死循环,按照3L说的,是不是当输入错误的数字时,缓存区就会自动释放,而输入英文字母的话,缓存区就不会释放,所以造成死循环呢?求解决方法。。
#8
cin 出错,类型不匹配。。 输入缓冲区异常, 重新定位。。。 cin.sync();cin.clear()。。。
干嘛一定要用int去接受, 然后再输入字符, 这不是自寻死路吗?? 改为全接受字符不久OK了, 搞不懂你。。
干嘛一定要用int去接受, 然后再输入字符, 这不是自寻死路吗?? 改为全接受字符不久OK了, 搞不懂你。。
#9
建议 int x; 改为 CString x;试试
#10
参考:
struct zuoye{
int arrayTime;
int serveTime;
}data[5];
int main()
{
int n=0,x;
while(n<5)
{
data[n].arrayTime=n;data[n++].serveTime=4;
data[n].arrayTime=n;data[n++].serveTime=3;
data[n].arrayTime=n;data[n++].serveTime=5;
data[n].arrayTime=n;data[n++].serveTime=2;
data[n].arrayTime=n;data[n++].serveTime=4;
}
cout<<endl<<endl<<endl<<" ^_^***********JH***********欢迎使用JH人软件************JerryHu*********^_^ "<<endl<<endl;
cout<<" no1:FCFS举例,请按1;"<<endl;
cout<<" no2:SJF举例,请按2;"<<endl;
cout<<" no3:HRN举例,请按3;"<<endl;
cout<<" no4:退出,请按4;"<<endl;
cin>>x;
cin.clear();
cin.sync();
cout << x << endl;
switch(x)
{
case 1:
cout<<"FCFS\n";
main();
break;
case 2:cout<<"SJF\n";
main();
break;
case 3:cout<<"HRN\n";
main();
break;
case 4:cout<<"感谢使用!";
break;
default:
if(x > 4 || x < 0)cout<<"输入错误,请重新输入。\n\n";
main();
break;
}
return 0;
}
#11
加一个判断是不是字符就好了,不然输入是字符的话一直都跳不出switch