修复一个无意的无限循环

时间:2015-10-11 18:58:52

标签: c++

当我输入像63453462这样的随机数时,它会响应"无效数字"但是在一个无限循环中但是如果我输入一个像2,000,002这样的数字它只是说没有循环的无效数字。当有人插入像2145345665465这样的随机数时,我需要帮助而不是无限循环。

#include <iostream>
using namespace std;
int main ()
{
int sum , input , number;                    

cout << "Enter any positive integer that is less than or " ;
cout << "equal to 2,000,000 to determine if it is divisible by 11.";
cout << endl;
cout << "If the number is greater than 99, we use Dodgsons's rule";
cout << endl;
cout << "which determines if it is a factor or not.\n";
cout << endl;
cin  >> input;


   while ((input < 1) || ( input > 2000000 ))
     {
        cout << "Invalid number detected, please enter a positive integer.\n"; 
        cin >> input;
     }  

     number = input;

      while ((input>=100) && (input < 2000000)) 
    {
     sum = input % 10;
     input = input /10 - sum;
     cout << input << endl;
     }

     if (input % 11 == 0)
     cout << "the number is divisible by 11." << endl;
     else 
     cout << "the number is not divisible by 11." << endl;

system ("Pause");
return 0;
}

2 个答案:

答案 0 :(得分:0)

   while ((input < 1) || ( input > 2000000 ))
{
    cout << "Invalid number detected, please enter a positive integer.\n";
    cin >> input;
    cin.clear(); 
}

cin.clear()将清除导致无限循环的任何先前状态。

答案 1 :(得分:0)

您需要正确检查输入操作是否成功。如果您输入的内容无法解析为整数,或者某些值超过INT_MAX或小于INT_MIN,则在

之后
cin >> input

std::cin将进入失败状态,这意味着failbit已设置。之后,除非您处理它,否则每个后续输入操作也将失败。

这里常用的方法是清除输入缓冲区(输入无法处理),然后再试一次:

while (not (cin >> input) or not is_valid(input)) {
  cout << "Invalid input, try again" << endl;
  cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
  cin.clear();
}

首先执行输入操作(cin >> input)并检查它是否not成功,并且只有当它不成立时(即输入操作成功)才检查输入是否为{{1} }使用某些not函数有效。在这种情况下,会打印一个错误,从流中删除包括下一个换行符在内的所有字符,并清除is_valid,以便获得有效输入的新内容。

注意,有两个相同类型的变量并且正在执行

failbit

在这里没用,您可以直接读入number = input; (更恰当地命名)并将变量number全部放在一起。