2015-12-22 215 views
3

在这个循环中,用户应该输入一个int并且程序检查它是否是奇数它会转到下一个部分,但是我不明白为什么如果用户输入的字符不是int ,该程序正陷入无限循环!do-while循环与if C++

int num; 
do { 
    cout << "PLEASE enter the num: "; 
    cin >> num; 
    if (num % 2 == 0) 
     cout << "Number should be odd!" << endl; 
    else 
     break; 
} while (true); 
//... 

原因反正char/int != 0,如果它是==0也应该在明年cin停止,但它不会停止! 我也试过ws(cin),但它没有帮助我。 请告诉我如何解决这个问题,以及为什么会发生这种情况。

+2

见[此](http://stackoverflow.com/questions/13378989/why-does-stringstream-change-value-of-target-on-failure)。 – LogicStuff

回答

4

由于您的程序不检查cin >> num;的结果。由于cin >> num;(其中num是一个整数)将读取所有可用的数字,并且如果输入根本不是数字[并且不是空格字符,它们被跳过cin >>],则它会不断尝试读取输入。

这不是从你的问题清楚自己想要做的,当用户输入“askjhrgAERY8IWE”你的计划到底是什么 - 有两种解决方案,浮现在脑海中:

备选1移除错误的之后再问输入。这对于这个应用程序来说可能是正确的,因为它是交互式的,但是对于从文件中读取其输入的自动程序来说,这是一个糟糕的主意。

if(!(cin >> num)) 
{ 
    cout << "That deoesn't seem to be a number..." << endl; 
    cin.clear(); 
    cin.ignore(10000, '\n'); 
} 

Alt 2.退出并显示错误消息。当典型输入是数据文件时,这显然是正确的。

if(!(cin >> num)) 
{ 
     cout << "That deoesn't seem to be a number..." << endl; 
     exit(1); 
} 

您还应该添加代码来处理这个代码文件的末尾 - 文件输入,应该是可以接受的[除非文件中有具体的数据来结束标志。对于交互式输入(用户直接输入程序),文件结尾可能被认为是错误 - 这取决于接下来会发生什么。

+0

我在你的答案结尾处无意中想到了一些单词。 – BoBTFish

+0

@BoBTFish:谢谢,平常的“过早发布”。 –

+0

我想告诉你什么,但'CIN >> num'不是TRUE;当我进入'abcd'太 –

0

在你的程序中,标准输入流需要一个整数。当你给它一个字符时,cin不能将它放入整型变量中,即失败(设置错误标志)并将输入的字符留在缓冲区中(用于下一个cin赋值)。 CIN反复考虑的字符作为输入,并不停地进行故障和整型变量赋值为0。

为了防止这种情况,你可以修改你的程序作为

int num; 
    do{ 
     cout << "PLEASE enter the num: "; 
     while(!(cin>>num)){ 
     cin.clear(); 
     cin.ignore(INT_MAX,'\n'); 
     cout<<"Invalid. Enter a number"; 
    } 
     if (num % 2 == 0) 
      cout << "Number should be odd!" << endl; 
     else 
      break; 
    } 
while(true); 

包括limits.h中使用INT_MAX或者你可以使用10000的较大值。

cin.clear清除错误标志并使其准备好输入。 cin.ignore(INT_MAX,'\n')会忽略所有内容(最多可达INT_MAX个字符),直到下一个新行。这可以确保如果用户输入一个长行而不是一个数字,程序就可以正常工作。

+0

这不会帮助,如果用户编写'1abc',程序会接受它,并且会通过循环,但只有当输入为NUMBER且ODD通过循环时才需要。 –

0

我发现了一个方法来解决我的问题,我改变输入类型string,并提出了功能的打击:

int isNum(string input) 
{ 
    int digit, value = 0; 
    for (int i = 0; i < input.length(); i++) 
    { 
     digit = input[i] - '0'; 
     if (digit >= 0 && digit <= 9) 
      value = value * 10 + digit; 
     else 
     { 
      value = 0; 
      break; 
     } 
    } 
    return value; 
} 

它将返回输入作为int如果所有字符是0到9之间,和否则将return 0;给我,所以我使用返回int为我num