注册 登录
编程论坛 C++教室

while 的一个问题.帮帮忙!

sfier 发布于 2010-09-23 19:34, 596 次点击
看一下程序:


#include<iostream>
using namespace std;
int main()
{int a;
 cout<<"请输入1或2,其他无效"<<endl;
 cin>>a;
 while (a!=1&&a!=2)
    {
        cout<<"输入错误,请重新输入(需要按<1>  不需按<2>  其他无效)"<<endl;
        cin>>a;
    }
 return 0;
}


运行后,如果你输入了英文字母就悲剧了,大家试试,看看应该怎么改才不会出现现在运行后那种情况...谢谢!!!

9 回复
#2
无名可用2010-09-23 19:52
#include<iostream>
using namespace std;
int main()
{int a;
cout<<"请输入1或2,其他无效"<<endl;
while (cin>>a && a!=1 && a!=2)//cin>>a会返回流从缓冲区正确接收数据的个数
    {
        cout<<"输入错误,请重新输入(需要按<1>  不需按<2>  其他无效)"<<endl;
        cin>>a;
    }
return 0;
}

#3
sfier2010-09-23 20:02
2楼的程序,我运行过,但是还是不能很好解决... 还是谢谢你的回答
#4
无名可用2010-09-23 21:47
对不起,刚才没仔细看程序..
#include<iostream>
using namespace std;
int main()
{int a;
cout<<"请输入1或2,其他无效"<<endl;
cin>>a;
while (a!=1 && a!=2)//cin>>a会返回流从缓冲区正确接收数据的个数
    {
        if(cin.fail())//如果你输入的类型与a的类型不一致,cin流的状态就会变成failbit
        {
            cin.clear();//这句用来清除cin流的错误状态
            //下面两句用来把缓冲区中的错误字符取走
            char c;
            cin>>c;//这句不需要人为输入数据,sin流会自动将刚才你输错的字符取走
        }
        cout<<"输入错误,请重新输入(需要按<1>  不需按<2>  其他无效)"<<endl;
        cin>>a;
    }
return 0;
}
输入的字符先存在缓冲区,输入完成后再由cin流从缓冲区把你输入正确的数据取走
#5
m21wo2010-09-23 21:49
#include<iostream>
using namespace std;
int main()
{
char a;
cout<<"请输入1或2,其他无效"<<endl;
cin>>a;
while (a!='1'&&a!='2')
 {
        cout<<"输入错误,请重新输入(需要按<1>  不需按<2>  其他无效)"<<endl;
        cin>>a;
}
return 0;
}

把a 定义为字符型就可以解决啦!你原先的a 定义为整形,输入字符则会强制转化为整形,导致出错!!
#6
ljt2010-09-23 22:08
不就是类型的问题么
#7
sfier2010-09-23 23:04
实在是太感谢四楼和五楼了!!!你们的方法都可以,本来我也是想到了a 的类型问题,但是就是不知道,原来把 1 和 2 改成字符型就可以...谢谢!
#8
manliuhui2010-09-24 01:34
请问楼主用的什么编译器。我用的DEV-C++,楼主的代码一点错误都没有。我觉得楼主的代码理论上是没有错误的,定义类型和输入输出类型并没有不同。个人认为应该是编译器的问题。编译器将输出自动默认为char类型,而且不自动转换
#9
sfier2010-09-24 16:35
visual studio 2005 我用的
#10
zjh1712011-01-15 22:37
究竟应该听谁的啊,我也很郁闷5楼的代码,为什么把2转换为字符,2就自动编程字符 了呢,好蹊跷啊
1