簡體   English   中英

帶限制的cin.ignore是否繼續丟棄新輸入?

[英]Does cin.ignore with a limit continue discarding new input?

我正在努力學習C ++,並且已經陷入了一種帶有一些我無法理解的cin行為的rabbithole。 這是我的代碼:

#include <iostream>

using namespace std;

int main()
{
    int num;

    // Get valid input
    do
    {
        if (!cin)
        {
            // Clear error state and flush any garbage input
            cin.clear();
            cin.ignore(numeric_limits<streamsize>::max());
        }

        cout << "Please enter a number: ";
        cin >> num;
    } while (!cin);

    // Echo back what we heard
    cout << "You entered: " << num << "\n";

    cin.get();
}

這里的問題是,當我第一次輸入無效輸入(例如一些字母字符)時,程序會卡在cin.ignore(numeric_limits<streamsize>::max())語句中。 我可以繼續輸入內容(包括換行符),程序永遠不會超過該語句。

據我所知,這表明如果cin.ignore的第一個參數超過緩沖區的當前大小,任何未來的字符(直到提供的限制)將繼續被丟棄。 它是否正確? 如果它是正確的,我如何清除輸入緩沖區而不影響將來的輸入?


注意:出於某種原因,使用cin.ignore(numeric_limits<streamsize>::max(), '\\n') ,並在cin >> num之后添加cin.ignore()使代碼正常工作。 這只是為了澄清我知道這種可能性存在,但我仍然有興趣了解上面的代碼中出現了什么問題(未指定\\n分隔符)。

您的代碼正在清除任何錯誤標志,然后丟棄其他字符,直到命中了numeric_limits<streamsize>::max()的硬限制或EOF字符(通常可以通過Ctrl + Z輸入一個)。 因此,正如您所懷疑的那樣,它會不斷丟棄您的輸入。

代碼的固定版本只能丟棄字符,直到找到換行符

#include <iostream>
#include <limits>

using namespace std;

int main()
{
  int num;

  // Get valid input
  do
  { 
    if (cin.fail())
    {
      // Clear error state and flush any garbage input
      cin.clear();
      cin.ignore(numeric_limits<streamsize>::max(), '\n');
    }

    cout << "Please enter a number: ";
    cin >> num;

  } while (cin.fail());

  // Echo back what we heard
  cout << "You entered: " << num << "\n";

  cin.get();
}

實例

可能是一個更慣用和緊湊的版本

#include <iostream>
#include <limits>
using namespace std;

int main()
{
  int num;

  // Get valid input
  while( (cout << "Please enter a number: ") && !(cin >> num) )
  {
    cout << "Invalid number entered" << endl;
    // Clear error state and flush any garbage input
    cin.clear();
    cin.ignore(cin.rdbuf()->in_avail());
  }

  // Echo back what we heard
  cout << "You entered: " << num << "\n";

  cin.get();
}

實例

正如您所提到的, cin.rdbuf()->in_avail()可能是一個更簡單的解決方案,因為它將完全丟棄可在流中讀取的字符數。

暫無
暫無

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

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