簡體   English   中英

C ++中的輸入錯誤檢查

[英]Input Error Checking in c++

    int x; // intitialize x but don't immediately prompt for input. This makes the program more user friendly

    cout << "Enter a year to check if it's a leap year: " << endl;
    cin >> x;

    while (cin.fail()) // check for input error

    {
    cin.clear();
    cin.ignore();
    cout << "You entered an incorrect value. Try again" << endl;
    cin >> x;
    }

我在理解失敗狀態如何在C ++中工作時遇到了麻煩。 我想發生的是,如果用戶輸入的內容中包含除數字以外的任何內容,它將清除緩沖區並提示您進行其他輸入。 我的代碼似乎沒有做到這一點。 如果我輸入類似r4之類的內容,那么我的其余代碼(效果很好,因此我沒有在下面顯示)將與這四個代碼一起運行。 似乎在某個時候激活了循環。 提示字符串仍然打印。 只是它並沒有給我機會重新輸入並繼續檢查。

下表是從http://en.cppreference.com/w/cpp/io/basic_ios/fail獲取的 ,顯示了影響istream::fail()返回值的各種狀態。

在此處輸入圖片說明

鑒於此,您應該使用:

while (cin.fail()) // check for input error
{
   if ( cin.eof() )
   {
      // Once EOF file has been reached with cin,
      // you can't do much. Figure out a way to bail
      // from the loop.
   }

   cin.clear();

   // Also, ignore not just one character but till the end of the line.
   // cin.ignore();
   cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

   cout << "You entered an incorrect value. Try again" << endl;
   cin >> x;
}
cin >> x;

cin檢查緩沖區中是否有任何東西。 緩沖區為空,因此它將等待用戶按下回車鍵,然后將所有內容復制到緩沖區中( r4 )。 然后,它嘗試從緩沖區加載到int 第一個字節是r ,因此它設置流的故障狀態並中止。 r4保留在緩沖區中。

cin.clear();

這將清除故障狀態, r4保留在緩沖區中。

cin.ignore();

這將忽略緩沖區中的第一個字符。 4保留在緩沖區中。

cout << "You entered an incorrect value. Try again" << endl;
cin >> x;

cin檢查緩沖區中是否有任何東西, 並且有4 ),因此它將嘗試從緩沖區加載到int ,該操作成功並如您所見繼續。

通常的解決方案是使用cin.ignore(std::numeric_limits<std::streamsize>::max(), '\\n') ,它忽略行的其余部分。

cin.good()cin.fail()會告訴您是否可以處理輸入(有效) cin.clear()在需要時清除錯誤狀態。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM