C++无限循环的有关问题

C++无限循环的问题?
本帖最后由 damimi111 于 2013-03-11 16:47:23 编辑
本来我写了一个较简单的求阶乘的代码。
但是由于阶乘数必须为正整数,我想要达到一个效果,就是如果用户输入的值不是正整数,那么就报错,然后报错后,再让用户重新输入,于是我就写了一个循环,如下:


#include <iostream>
#include "StdAfx.h"
using namespace std;

long Factorial (int n);

int main()
{
bool running = true;
while (running)
{
cout << "Please enter an integer to compute: ";
int n;
if(cin >> n && n >= 1)
{
cout << n << "! is " << Factorial(n) << endl;
running = false;
}
else
{
cout << "Invalid input! please try again!" << endl;
}
}
return 0;
}

long Factorial (int n)
{
if (n == 1)
return 1;
else
return n * Factorial(n - 1);
}


于是问题来了,当我输入负数,比如“-5”,那么能够正常输出"Invalid input! please try again!"然后再进入循环,提示用户再输入。

但是,当我输入一个字符时,比如我输入一个“h”,则此时由于对于int类型的n赋值不成功,则会进入"Invalid input! please try again!"这句话的无限循环!!

于是我改进了一下,代码如下:


#include <iostream>
#include "StdAfx.h"
#include <string>
using namespace std;

long Factorial (int n);

int main()
{
bool running = true;
while (running)
{
cout << "Please enter an integer to compute: ";
int n;
if(cin >> n && n >= 1)
{
cout << n << "! is " << Factorial(n) << endl;
running = false;
}
else
{
cin.clear();
string c;
                cin >> c;
cout << "Invalid input! please try again!" << endl;
}
}
return 0;
}

long Factorial (int n)
{
if (n == 1)
return 1;
else
return n * Factorial(n - 1);
}


以上这段代码,对于“h”“asdad”之类的错误输出能够正常报错,并再次进入循环,但此时,如果我输入“-5”,则cin.clear();语句将会把这个值清楚,后面的string c就会等待被赋值,于是程序就又停止在那里了,始终无法达到想要的效果。

我想要达到“无论是输入英文字符串,或者是负数,都能够正常报错,并且再次进入循环,要求用户再输入”这样的一个效果,但实在不知道该怎么改进代码了,求高手指教,谢谢!
c++ integer cin

------解决方案--------------------

#include <iostream>
#include <string>
using namespace std;

long Factorial (int n);

int main()
{
bool running = true;

int n;

while (running)
{
cout << "Please enter an integer to compute: ";
if(cin >> n && n >= 1)
{
cout << n << "! is " << Factorial(n) << endl;
running = false;
}
else
{
cin.clear();