回答:
おそらく:
std::cin.ignore(INT_MAX);
これにより、まで読み込まれ、無視されますEOF
。(2番目の引数を指定して、それまでに読み取る文字を指定することもできます(例:'\n'
1行を無視する)。
また、次のことも実行する必要があります。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
とフラッシュする上で最初の文を使用しcin
、それは私が入るまでの入力を促す続け、バッファをEOF
押してctrl+d
?
これに対する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();
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.seekg(0,ios::end);
cin.clear();
stdinストリームの末尾にcinポインターを配置するだけで、cin.clear()はEOFフラグなどのすべてのエラーフラグをクリアします。
以下はうまくいくはずです:
cin.flush();
一部のシステムでは使用できず、使用できます。
cin.ignore(INT_MAX);
flush
メソッドは出力専用であり、すでに書き込まれた文字を扱います。
basic_istream<char>' has no member named 'flush'
cin.get()
奇妙なことに自動的にそれをフラッシュするようです(これは混乱しやすく、おそらく気質があるため、おそらく推奨されません)。