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

C++无限循环的问题?本帖最后由 damimi111 于 2013-03-11 16:47:23 编辑本来我写了一个较简单的求阶乘的代

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();


cin.sync();
cout << "Invalid input! please try again!" << endl;
}
}
return 0;
}

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


[解决办法]
#include <iostream>
#include <string>
using namespace std;

long Factorial (int n);

int main()
{
bool running = true;
while (running)
{
cout << "Please enter an integer to compute: ";
string n;
cin >> n; //规范代码
if( atoi(n.c_str()) >= 1)
{
cout << atoi(n.c_str()) << "! is " << Factorial(atoi(n.c_str())) << 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);
}


这个代码只给你解决了你遇到的问题,要想完美,你接着我的代码完善,切忌,代码风格问题!
[解决办法]
你的代码中流操作出错了;你是期待输入int类型,但是却输入了字符串类型;于是返回0,if条件失败,然后执行else中的语句;cin缓存未清空,进入无限循环中;下面是一种改进方案,可试一试!

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

long Factorial (int n);

int main()
{
    bool running = true;
    while (running)
    {
        cout << "Please enter an integer to compute: ";
        string str_n;
        int n;

        cin>>str_n;

        n = atoi(str_n.c_str());

        if(n >= 1)
        {
            cout << str_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并不是被cin.clear()给弄没了,而是if语句中的cin>>n给读取了
#include<iostream> 
#include<cctype>
#include<string>
#include<cstdlib> 
#include<dos.h>
using namespace std;  

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


int main()
{
int k1=0;
char the_char;
char number_char[50];

for(int i=0;i<50;i++)//初始化字符数组
{
number_char[i]='$';
}

start:
cout<<"请输入一个正整数:"<<endl;
cin.get(the_char);

if(isdigit(the_char))
while(1)
{
if(isdigit(the_char)) 
{
number_char[k1++]=the_char;
}
else if(the_char!='\n')//如果为非结束符,则输入有误
{
cout<<"输入的为非正整数!请重新输入!"<<endl;
system("cls");
goto start;
}
else if(the_char=='\n')
break;

cin.get(the_char);
}
else
{
cout<<"输入的为非正整数!请重新输入!"<<endl;
system("cls");
goto start;
}

int number=atoi(number_char);
cout<<number<<"! is:"<<Factorial(number)<<endl;
return 0;
}


[解决办法]

// sb3.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<iostream>
using namespace std;
long Factorial (int n);

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

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


if(!cin)判断是否输入正确,如果输入错误的类型  比如你想输入 int类型 结果输入了char  则会出现cin输入错误 fail() 被设定为真 failbit被设定  cin被标记错误 不可用( 意思是 出现不匹配 )然后就得用clear()清除错误状态 就是清除错误状态 (也就是把failbit设置为0)然后还得用 while(cin.get()!='\n')    continue;吸收缓冲区 也就是错误字符后面的字符之类的 知道换行符 例如想输入 123  结果输入123ab456。。。就用上面的做法 解决了  发现cin又可用了。。。