首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

,一个C++小程序出有关问题(陷入死循环了),求解释

2013-04-20 
求助,一个C++小程序出问题(陷入死循环了),求解释!自己编的一个小程序来练习类的用法,程序功能:根据选择来

求助,一个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;
   }

热点排行