C++ -Пока цикл продолжает повторяться при проверке, является ли ввод целым числом-

Я пытаюсь выполнить операцию модуля. Я прошу пользователя ввести два числа, поскольку модуль работает только с целыми числами, у меня есть цикл while, который проверяет, являются ли входные данные целыми числами. Затем цикл while просит пользователя повторно ввести два числа. Но цикл while продолжает повторяться и не дает пользователю возможности повторно ввести числа. Что будет правильным для этого?


#include <iostream>
using namespace std;

int Modulus (int, int,struct Calculator);

struct Calculator
{
    int per_numb1, per_numb2;
    int per_Result; };

int main () 
{ 
    Calculator Operation1;

    cout << "\nPlease enter the first number to calculate as a modulus: "; 
    cin >> Operation1.per_numb1; 

    cout << "\nPlease enter the second number to calculate modulus: "; 
    cin >> Operation1.per_numb2; 

while ( !( cin >> Operation1.per_numb1)  ||   !( cin >> Operation1.per_numb2))
{ 

        cout << "\nERROR\nInvalid operation \nThe first number or second number   must be an integer"; 
        cout << "\n\nPlease re-enter the first number to begin Modulus: "; 
        cin >> Operation1.per_numb1;  

        cout << "\nPlease re-enter the second number to begin Modulus: ";
        cin >> Operation1.per_numb2;
}





Operation1.per_Result = Modulus(Operation1.per_numb1, Operation1.per_numb2, Operation1); 

cout << "\nThe result  is: " << Operation1.per_Result << endl;

}

int Modulus (int n1, int n2, struct Calculator)
{
    int Answer; 

    Answer = n1 % n2; 

    return Answer; 
} 

person user2203675    schedule 24.03.2013    source источник
comment
Если ввод не удался, вам необходимо очистить входной поток.   -  person Daniel Fischer    schedule 24.03.2013
comment
Я пытался использовать cin.clear(Operation1.per_numb1) и cin.clear(Operation1.per_numb2) в цикле while, но все равно не работает   -  person user2203675    schedule 24.03.2013
comment
возможный дубликат бесконечного цикла с cin   -  person sashoalm    schedule 09.02.2015


Ответы (2)


Рефакторинг к чему-то вроде этого:

 #include <iostream>
 #include <string>
 #include <limits>

 using namespace std;

 class Calculator
 {
 public:
     static int Modulus (int n1, int n2);
 };

 int Calculator::Modulus (int n1, int n2)
 {
     return n1 % n2; 
 }

 int getInt(string msg)
 {
     int aa;

     cout << msg;
     cin >> aa;
     while (cin.fail())
     {
         cin.clear();
         cin.ignore(std::numeric_limits<streamsize>::max(),'\n');
         cerr <<  "Input was not an integer!" << endl;
         cout << msg;
         cin >> aa;
     } 
     return aa;
 }

 int main () 
 { 
     int num1 = getInt("Enter first value: ");
     int num2 = getInt("Enter second value: ");
     int value = Calculator::Modulus(num1,num2);
     cout << "Answer:" << value << endl ;
 }
person John Jesus    schedule 24.03.2013
comment
Я еще не узнал о классах. Какие особенности я могу просто изменить в исходной программе, чтобы она работала правильно? - person user2203675; 24.03.2013
comment
Не используйте цикл while. Вместо этого используйте функцию, подобную getInt(), которую я предоставил. Обратите внимание, как он проверяет наличие ошибки, используя cin.fail(), и как он очищает входной поток и ошибку, используя cin.clear() и cin.ignore(). - person John Jesus; 24.03.2013
comment
Благодарю вас. Я использовал cin.ignore(std::numeric_limits‹streamsize›::max(),'\n'); - person user2203675; 24.03.2013

При сбое синтаксического анализа входных данных в потоке останутся недопустимые входные данные. Тебе следует

  1. очистить состояние ошибки потока, вызвав cin.clear().
  2. и пропустите оставшийся недопустимый ввод.

См. ответ на этот вопрос.

person Alex B    schedule 24.03.2013
comment
Где именно я буду вызывать cin.clear(). Будет ли это после того, как я попрошу пользователя повторно ввести цифры? - person user2203675; 24.03.2013
comment
@user2203675 user2203675 после того, как вы не смогли получить номер от пользователя. - person Alex B; 24.03.2013
comment
Не могли бы вы показать мне отредактированную копию моей программы, чтобы я мог видеть, где именно. Я попробовал то, что вы сказали мне, но это все еще не работает. - person user2203675; 24.03.2013