124

C++ で cin バッファをクリアするにはどうすればよいですか?

4

13 に答える 13

131

C バージョンよりも C++ のサイズ制約を優先します。

// Ignore to the end of file
std::cin.ignore(std::numeric_limits<std::streamsize>::max())

// Ignore to the end of line
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n')
于 2008-11-02T18:34:19.930 に答える
109

おそらく:

std::cin.ignore(INT_MAX);

これは、 まですべてを読み込み、無視しますEOF。(次の引数まで読み取る文字を指定することもできます (例: '\n'1 行を無視する)。

std::cin.clear();また、ストリームの状態をリセットするために、これの前にa: を実行することもできます。

于 2008-11-02T17:37:55.347 に答える
30
cin.clear();
fflush(stdin);

これは、コンソールから読み取るときに機能した唯一のことでした。それ以外の場合は、\n がないために無限に読み取られるか、何かがバッファに残ります。

編集:以前の解決策が事態を悪化させたことがわかりました。ただし、これは機能します:

cin.getline(temp, STRLEN);
if (cin.fail()) {
    cin.clear();
    cin.ignore(numeric_limits<streamsize>::max(), '\n');
}
于 2014-05-19T18:47:24.777 に答える
11
int i;
  cout << "Please enter an integer value: ";

  // cin >> i; leaves '\n' among possible other junk in the buffer. 
  // '\n' also happens to be the default delim character for getline() below.
  cin >> i; 
  if (cin.fail()) 
  {
    cout << "\ncin failed - substituting: i=1;\n\n";
    i = 1;
  }
  cin.clear(); cin.ignore(INT_MAX,'\n'); 

  cout << "The value you entered is: " << i << " and its double is " << i*2 << ".\n\n";

  string myString;
  cout << "What's your full name? (spaces inclded) \n";
  getline (cin, myString);
  cout << "\nHello '" << myString << "'.\n\n\n";
于 2009-10-09T09:26:06.807 に答える
6

どうですか:

cin.ignore(cin.rdbuf()->in_avail());
于 2009-02-11T20:30:29.077 に答える
4

私が好む:

cin.clear();
fflush(stdin);

cin.ignore がうまくいかない例がありますが、現時点では考えられません。私がそれを使う必要があったのは少し前のことです(Mingwで)。

ただし、fflush(stdin) は、標準では未定義の動作です。fflush() は、出力ストリームのみを対象としています。fflush(stdin)は、C 標準の拡張機能としてWindows (少なくとも GCC および MS コンパイラを使用) でのみ期待どおりに動作するようです。

したがって、それを使用すると、コードは移植できなくなります。

fflush(stdin) の使用を参照してください。

また、別の方法についてはhttp://ubuntuforums.org/showpost.php?s=9129c7bd6e5c8fd67eb332126b59b54c&p=452568&postcount=1を参照してください。

于 2008-11-02T18:55:44.330 に答える
4

別の可能な(手動の)解決策は

cin.clear();
while (cin.get() != '\n') 
{
    continue;
}

CLion では fflush や cin.flush() を使用できないため、これは便利でした。

于 2015-08-07T08:15:48.547 に答える
1

以下が機能するはずです。

cin.flush();

一部のシステムでは利用できないため、次を使用できます。

cin.ignore(INT_MAX);
于 2008-11-02T17:34:44.790 に答える
0

cin.get()奇妙に自動的にフラッシュするようです (ただし、これは紛らわしく、おそらく気まぐれなので、おそらく好まれません)。

于 2015-03-19T21:38:44.077 に答える