再问大家一个问题?(懂C++的朋友看看,运行时一输入英文就死循环,数字就不会。。)

时间:2022-01-27 09:26:54
    
    以下是一段代码,前面的不重要,关键是最后的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,当然是死循环啦!!

#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++多少次。。。

#5


引用 3 楼 jietoulangren 的回复:
default: 
    cin.sync();//清除缓冲区
    cin.clear();//清除错误状态
如果没有上述两行代码,则错误的输入会一直保留在缓冲区中,且cin处于关闭状态
LZ的代码中,缓冲区中的值一直为0,当然是死循环啦!!

这么说是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了, 搞不懂你。。

#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

#12


不知道楼主说的是不是下面的问题

http://blog.csdn.net/mougaidong/article/details/6882345

#1


看看。。。

#2


   补充一下,程序是用VC++6.0编译调试的。

#3


default: 
    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++多少次。。。

#5


引用 3 楼 jietoulangren 的回复:
default: 
    cin.sync();//清除缓冲区
    cin.clear();//清除错误状态
如果没有上述两行代码,则错误的输入会一直保留在缓冲区中,且cin处于关闭状态
LZ的代码中,缓冲区中的值一直为0,当然是死循环啦!!

这么说是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了, 搞不懂你。。

#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

#12


不知道楼主说的是不是下面的问题

http://blog.csdn.net/mougaidong/article/details/6882345