为什么我的“goto”循环?

时间:2014-09-17 18:37:11

标签: c++

当我运行这个程序时,我的输出只是我的cout循环。好像现在正在跳过cin?有没有人知道为什么会这样?

TryAgain:
 cout<<"\nEnter a number greater than 1 and less than 100: ";                // 21 - Request a Number
 cin>>num;                                                                   // 22 - Store the number

      if (cin.fail()) {
        cout << "Please enter a number!\n\n";
        goto TryAgain;
         }

      if (num<=1){                                                           // 24 - IF NUMBER IS BELOW 1
          cout<<"Oh no, " << num << " is too small!\n\n";                    // 25 - Print Error Message
            return 0;
           }

      if (num>=100){                                                         // 29 - IF NUMBER IS OVER 100
          cout<<"Oh no, " << num << " is too large!\n\n";                    // 30 - Print Error Message
            return 0;
           }


          else  if (isprime(num)){  //Call isprime                           // 34 - IF ISPRIME IS TRUE
          cout << "True, " << num << " is a prime number!!\n\n";             // 35 - Print True Message
          }

                   else{                                                     // 38 - IF ISPRIME OS FALSE
                   cout << "False, " << num << " is not a prime number!!\n\n"; // 39 - rint False Message
                   }

2 个答案:

答案 0 :(得分:3)

cin失败时,它将进入错误状态,导致它始终失败。您需要清除该错误状态。

cin.clear();

如果您要再次执行相同的输入操作,还需要删除(至少部分)先前输入的数据,否则cin将再次失败。

cin.ignore(numeric_limits<streamsize>::max(), '\n');

答案 1 :(得分:2)

你必须使用std :: cin的两个成员函数:ignore和clear。例如

#include <limits>

//...
  if (cin.fail()) {
    cout << "Please enter a number!\n\n";
    cin.clear();
    cin.ignore( numeric_limits<streamsize>::max() );
    goto TryAgain;
     }

使用goto语句也是一个坏主意。你可以写

do
{
    if ( !cin ) 
    {
        cin.clear();
        cin.ignore( numeric_limits<streamsize>::max() );
    }

    cout<<"\nEnter a number greater than 1 and less than 100: ";
    cin>>num;
} while ( !cin );