C++ で cin バッファをクリアするにはどうすればよいですか?
13 に答える
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')
おそらく:
std::cin.ignore(INT_MAX);
これは、 まですべてを読み込み、無視しますEOF
。(次の引数まで読み取る文字を指定することもできます (例: '\n'
1 行を無視する)。
std::cin.clear();
また、ストリームの状態をリセットするために、これの前にa: を実行することもできます。
cin.clear();
fflush(stdin);
これは、コンソールから読み取るときに機能した唯一のことでした。それ以外の場合は、\n がないために無限に読み取られるか、何かがバッファに残ります。
編集:以前の解決策が事態を悪化させたことがわかりました。ただし、これは機能します:
cin.getline(temp, STRLEN);
if (cin.fail()) {
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
}
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";
どうですか:
cin.ignore(cin.rdbuf()->in_avail());
私が好む:
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を参照してください。
別の可能な(手動の)解決策は
cin.clear();
while (cin.get() != '\n')
{
continue;
}
CLion では fflush や cin.flush() を使用できないため、これは便利でした。
以下が機能するはずです。
cin.flush();
一部のシステムでは利用できないため、次を使用できます。
cin.ignore(INT_MAX);
cin.get()
奇妙に自動的にフラッシュするようです (ただし、これは紛らわしく、おそらく気まぐれなので、おそらく好まれません)。