读书人

一个C++小程序出有关问题(陷入死循

发布时间: 2013-04-20 19:43:01 作者: rapoo

求助,一个C++小程序出问题(陷入死循环了),求解释!
自己编的一个小程序来练习类的用法,
程序功能:根据选择来输出boy say:Hello,或Girl say :world。
问题:
输入0、1、2没问题,直接输入其它数字或字母也没问题,但先输入1,再输入2,最后输入字母时陷入死循环了,求解释。
(调试环境 visual studio 2012)

                            
[解决办法]

//主函数

#include<iostream>
#include <limits>
using namespace std;
//头文件human.h ,父类
#pragma once
class human
{
public:
human(void);


virtual void say(){}
virtual ~human(void);
};

//父类函数
human::human(void)
{
cout<<"构造human"<<endl;
}
human::~human(void)
{
cout<<"析构human"<<endl;
}

//子类boy头文件
#pragma once
class boy: public human
{
public:
boy(void);
virtual void say();
virtual ~boy(void);
};

//boy.h的函数,human的子类
boy::boy(void)
{
cout<<"构造boy"<<endl;
}
void boy::say(void)
{
cout<<"Boy says: Hello"<<endl;
}
boy::~boy()
{
cout<<"析构boy"<<endl;
}


//girl.h,human之类
#pragma once
class girl: public human
{
public:
girl(void);
virtual void say();
virtual ~girl(void);
};

//girl.h的函数
girl::girl(void)
{
cout<<"构造girl"<<endl;
}
void girl::say(void)
{
cout<<"Girl says: World!"<<endl;
}

girl:: ~girl(void)
{
cout<<"析构girl"<<endl;
}


int main()
{
human* p;
int choice=0;
cout<<"请选择:"<<"0.Exet; 1.Boy say; 2.Girl say"<<endl;
while(1)
{
while (!(std::cin>>choice)
[解决办法]
std::cin.peek()!='\n')
{
std::cin.clear();// 恢复状态标志
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');// 略过缓存
std::cerr << "输入数据错误,请重新输入:" << std::endl;
}

switch(choice)
{
case 1:
p=new boy;
p->say();
delete p;
break;
case 2:
p=new girl;
p->say();
delete p;
break;
default:
cout<<"请选择:"<<"0.Exet; 1.Boy say; 2.Girl say"<<choice<<endl;
break;
}
if(choice==0)break;
}
return 0;
}
[解决办法]
我想应该是输入流cin的状态的问题,也就是这一句cin>>choice;他当你第一次读入失败时,无法进行第二次读入,所以你的choice一直停留在你最后正确输入的数,也就是2,所以会一直循环下去,你可以去试试每当重新循环的时候重新设置输入流的状态,这样应该可以避免死循环。
[解决办法]
1:由于choice为int型
2: cin>>choice时输入字母时,由需要的是int型,而此时输入的是char型或者字符串型,cin输入对像会发生状态错误,内部缓存指针并不移动,仍指向上一次结果,并设置错误标志,因此返回上一次的结果
3:基于上述2 ,下次再遇到cin时,由于cin缓存指针所指地方已有数据,即上一次你正确输入的一个数,故不会再等待用户输入了,因此陷入死循环
4:可参考getchar缓存机制http://www.cnblogs.com/WJPeng/archive/2012/12/11/2812287.html[/url]

       cin>>choice;
if(!cin.good())
{
choic=3;
}

读书人网 >C++

热点推荐