C++程序陷入死循环,如何避免?
要求输入一个int,但输入字符或字母程序就陷入死循环代码如下,求教!#include<iostream>usingstd::cout;usingstd::endl;cla...
要求输入一个int,但输入字符或字母程序就陷入死循环
代码如下,求教!
#include <iostream>
using std::cout;
using std::endl;
class Dog
{
public:
void Speak()const { cout << "Woof!" << endl; }
void Move() const { cout << "Walking to heel..." << endl; }
void Eat() const { cout << "Gobbling food..." << endl; }
void Growl() const { cout << "Grrrrr" << endl; }
void Whimper() const { cout << "Whining noises..." << endl; }
void RollOver() const { cout << "Rolling over..." << endl; }
void PlayDead() const
{ cout << "The end of Little Caesar?" << endl; }
};
typedef void (Dog::*PDF)()const ;
int main()
{
const int MaxFuncs = 7;
PDF DogFunctions[MaxFuncs] =
{Dog::Speak,
Dog::Move,
Dog::Eat,
Dog::Growl,
Dog::Whimper,
Dog::RollOver,
Dog::PlayDead };
Dog* pDog =0;
int Method;
bool fQuit = false;
while (!fQuit)
{
cout << "(0)Quit (1)Speak (2)Move (3)Eat (4)Growl";
cout << " (5)Whimper (6)Roll Over (7)Play Dead: ";
std::cin >> Method;
if (Method < 0 || Method >= 8)
{
cout<<"输入错误!请重新输入:\n";
continue;
}
if(Method==0)
{
fQuit=true;
}
else
{
pDog = new Dog;
(pDog->*DogFunctions[Method-1])();
delete pDog;
}
}
return 0;
} 展开
代码如下,求教!
#include <iostream>
using std::cout;
using std::endl;
class Dog
{
public:
void Speak()const { cout << "Woof!" << endl; }
void Move() const { cout << "Walking to heel..." << endl; }
void Eat() const { cout << "Gobbling food..." << endl; }
void Growl() const { cout << "Grrrrr" << endl; }
void Whimper() const { cout << "Whining noises..." << endl; }
void RollOver() const { cout << "Rolling over..." << endl; }
void PlayDead() const
{ cout << "The end of Little Caesar?" << endl; }
};
typedef void (Dog::*PDF)()const ;
int main()
{
const int MaxFuncs = 7;
PDF DogFunctions[MaxFuncs] =
{Dog::Speak,
Dog::Move,
Dog::Eat,
Dog::Growl,
Dog::Whimper,
Dog::RollOver,
Dog::PlayDead };
Dog* pDog =0;
int Method;
bool fQuit = false;
while (!fQuit)
{
cout << "(0)Quit (1)Speak (2)Move (3)Eat (4)Growl";
cout << " (5)Whimper (6)Roll Over (7)Play Dead: ";
std::cin >> Method;
if (Method < 0 || Method >= 8)
{
cout<<"输入错误!请重新输入:\n";
continue;
}
if(Method==0)
{
fQuit=true;
}
else
{
pDog = new Dog;
(pDog->*DogFunctions[Method-1])();
delete pDog;
}
}
return 0;
} 展开
4个回答
展开全部
防错处理是编程非常重要的工作.
因此,你在程序设计的时候,就需要考虑所有可能的输入情况.
把不期望的输入过滤出来不做处理,或做错误处理.只对期望的输入做处理.
如果你在程序设计之初没有考虑对输入做检查的话,程序就会非你所愿的执行,这就是危害.没有什么比程序没有如程序员想象的那样去执行危害更大了.
以你的这个例子来说的话,你获取到输入后,就要判断输入的是什么,如果用户输入的是数字,那你就正常处理,如果用户输入的是其他你不希望的值,那你可以打印一个提示,说,请输入整数.然后程序返回.等等.
自己多考虑考虑.
因此,你在程序设计的时候,就需要考虑所有可能的输入情况.
把不期望的输入过滤出来不做处理,或做错误处理.只对期望的输入做处理.
如果你在程序设计之初没有考虑对输入做检查的话,程序就会非你所愿的执行,这就是危害.没有什么比程序没有如程序员想象的那样去执行危害更大了.
以你的这个例子来说的话,你获取到输入后,就要判断输入的是什么,如果用户输入的是数字,那你就正常处理,如果用户输入的是其他你不希望的值,那你可以打印一个提示,说,请输入整数.然后程序返回.等等.
自己多考虑考虑.
2011-09-02
展开全部
这是由cin>>Method ;这个语句决定的
由于定义了Method 是int类型,如果遇到cin不是int类型或者越界,则会出现异常,不会赋值给Method ,使其保持原值。字符无法被cin接收而一直停留在缓冲区,导致下一次cin时直接从缓存读数,但字符无法读取结果导致无限循环。
可以在continue;前面增加清除输入缓冲区的函数,如下:
cin.clear();
cin.ignore();
continue;
由于定义了Method 是int类型,如果遇到cin不是int类型或者越界,则会出现异常,不会赋值给Method ,使其保持原值。字符无法被cin接收而一直停留在缓冲区,导致下一次cin时直接从缓存读数,但字符无法读取结果导致无限循环。
可以在continue;前面增加清除输入缓冲区的函数,如下:
cin.clear();
cin.ignore();
continue;
追问
按你说的添加清除函数之后,输入字母能运行,输入字符就陷入死循环了。该怎么解决啊?
追答
在continue;前面再增加cin.sync();
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
可以在输入之后判断一下是数字还是字母(或字符),如果是非数字,跳转到输入部分的语句块,重复输入一次。思想告诉你,代码自己写。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
如果是这个样子话,你可能比较复杂了,获得一行字符string中,然后解析输入的数据是int还是其它类型的
追问
我是想让程序更加健壮些。
不明白的是输入类型错误后,程序会如何?有什么危害?
希望详细点
追答
可能需要多了解一下iostream库了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询