C++でcinバッファーをクリアするにはどうすればよいですか?
おそらく:
std::cin.ignore(INT_MAX);
これはEOF
まで読み込まれ、すべてを無視します。 (2番目の引数を指定することもできます。これは、1行を無視する'\n'
のように読み取る文字です)。
また:おそらく、この前にstd::cin.clear();
を実行して、ストリームの状態をリセットすることもできます。
私はCバージョンよりもC++サイズの制約を好むでしょう:
// Ignore to the end of file
cin.ignore(std::numeric_limits<std::streamsize>::max())
// Ignore to the end of line
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n')
cin.clear();
fflush(stdin);
これは、コンソールから読むときに私のために働いた唯一のものでした。それ以外の場合は、\ nがないために無期限に読み取られるか、バッファに何かが残ります。
編集:私は以前の解決策が事態を悪化させることがわかりました。ただし、これは機能します。
cin.getline(temp, STRLEN);
if (cin.fail()) {
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
}
これには2つの解決策があります。
最初の、最も簡単な方法は、std::getline()
を使用することです。例:
std::getline(std::cin, yourString);
...改行に達すると入力ストリームを破棄します。この関数の詳細については、こちらをご覧ください こちら 。
ストリームを直接破棄する別のオプションはこれです...
#include <limits>
// Possibly some other code here
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();
while (cin.get() != '\n')
{
continue;
}
CLionでfflushまたはcin.flush()を使用できないため、これは便利です。
私が好む:
cin.clear();
fflush(stdin);
Cin.ignoreでカットされない例もありますが、現時点では考えられません。 (Mingwで)使用する必要があったのは少し前のことでした。
ただし、fflush(stdin)は標準に従って未定義の動作です。 fflush()は出力ストリーム専用です。 fflush(stdin)は、Windows(少なくともGCCおよびMSコンパイラーを使用)で期待どおりに動作するようです C標準の拡張として 。
したがって、それを使用すると、コードは移植できなくなります。
fflush(stdin)の使用 を参照してください。
また、 http://ubuntuforums.org/showpost.php?s=9129c7bd6e5c8fd67eb332126b59b54c&p=452568&postcount=1 を参照してください。
最も簡単な方法:
cin.seekg(0,ios::end);
cin.clear();
Cinポインターをstdinストリームの最後に配置し、cin.clear()はEOFフラグなどのすべてのエラーフラグをクリアします。
#include <stdio_ext.h>
そして、関数を使用します
__fpurge(stdin)
以下が動作するはずです:
cin.flush();
一部のシステムでは使用できないため、次を使用できます。
cin.ignore(INT_MAX);
cin.get()
は、奇妙なことに自動的にフラッシュするようです(ただし、これは混乱し、おそらく気質であるため、おそらく好ましくありません)。