龙三和他的七人党结局:我这个程序出了点问题,谁能帮我看看,谢谢

来源:百度文库 编辑:高校问答 时间:2024/05/03 05:59:03
#include<iostream.h>

void main()
{
int a;
int b=1;

cout<<"你想知道一个秘密吗?如果想的话请输入1\n";
cin>>b;
int c=1;
while(b!=1&&c<=1)

{
cout<<"由于你没有听我的话,所以取消你知道这个秘密的权利\n";
c++;

}
if(b==1)
{
cout<<"王明是个特务\n";
cout<<"再输入你的学号试试: )\n";
cin>>a;

while(a!=4)
{
cout<<"王明的学号是4,输入4看看会有什么效果?\n";
cin>>a;
while(a!=4)
{
cout<<"你到底想不想知道秘密拉!入4看看\n";
cin>>a;

}
}

if(a==4)
cout<<"王明他弟弟也是个特务\n";
cout<<"游戏结束\n";

}
}
运行到第一个cin>>a时,当a输入的是一个小数时或字母时程序就会跳到"你到底想不想知道秘密拉!入4看看"处,而且还是个死循环,为什么啊?有没有什么方法可以解决?

错误在两个while里面.
当cin读取到错误的类型时,例如在本例中expect type是int,但输入流中出现了a,或小数,则cin会置一个出错状态.并停止读取.也就是说,当cin的状态为错误时,所有的cin读取都停止了.所以会死在内层循环中.

清空错误的方法是调用cin.clear()函数,但是仅仅调用它还不够.因为清空以后,外层while的cin起作用,但是输入流中的a还在,于是又再次出错.
所以还必须清空缓冲区.

改正后的两层while如下:
while(a!=4)
{
cout<<"王明的学号是4,输入4看看会有什么效果?\n";
cin.clear();while(cin.get()!='\n');
cin>>a;
while(a!=4)
{
cout<<"你到底想不想知道秘密拉!入4看看\n";
cin.clear();while(cin.get()!='\n');
cin>>a;
}
}

#include<iostream.h>

void main()
{
int a;
int b;

cout<<"你想知道一个秘密吗?如果想的话请输入1\n";
cin>>b;
int c=1;
while(b!=1&&c<=4)

{
cout<<"由于你没有听我的话,所以取消你知道这个秘密的权利\n";
c++;
cout<<"请重新输入密码:\n";
cin>>b;
}
if(c>4)cout<<"输入密码的次数已够,拜拜!";
if(b==1)
{
cout<<"王明是个特务\n";
cout<<"再输入你的学号试试: )\n";
cin>>a;

while(a!=4)
{
cout<<"王明的学号是4,输入4看看会有什么效果?\n";
cin>>a;
while(a!=4)
{
cout<<"你到底想不想知道秘密拉!入4看看\n";
cin>>a;

}
}

if(a==4)
cout<<"王明他弟弟也是个特务\n";
cout<<"游戏结束\n";

}
}