ユーザーがコマンドプロンプトに文字列を入力できるようにするこのコードに出くわしました。私は彼らが何をしているのか知っています、そしてそれはすべて素晴らしいです。しかし、cin関数とgetline()関数に関して質問があります。
string name ;
cout << "Please enter your full name: " ;
cin >> name ;
cout << "Welcome " << name << endl ;
cout << "Please enter your full name again please: " ;
getline(cin , name) ;
cout << "That's better, thanks " << name << endl ;
return 0 ;
これが出力されると、次の行に沿って何かが得られます:(入力としてjohn smithを使用)
Please enter your full name: john smith
Welcome John
Please enter your full name again: That's better thanks Smith
これが発生する理由を理解しました。getlineはまだ入力バッファーから読み取っていて、それを修正する方法を知っています。私の質問は、「フルネームをもう一度入力してください:」の後に改行がないのはなぜですか?コードを次のように変更すると:
string name ;
cout << "Please enter your full name: " ;
cin >> name ;
cout << "Welcome " << name << endl ;
cout << "Please enter your full name again please: " ;
cin.ignore( 256, '\n') ;
getline(cin , name) ;
cout << "That's better, thanks " << name << endl ;
return 0 ;
もう一度フルネームを入力すると、突然改行が入ります。正直言って、それほど大きな問題ではありません。しかし、誰かが私を助けてくれるなら、何が起こったのかを知っていてもかまいません。ありがとう!
ご覧のとおり、最初に「John Smith」を入力として入力すると、_cin >> name
_は行全体を読み取るのではなく、最初のスペースまで行の内容を読み取ります。
したがって、最初のcin
の後、name変数にはJohn
が含まれます。バッファにはまだ_Smith\n
_があり、次を使用してこれを解決しました。
_cin.ignore( 256, '\n') ;
_
注: Konrad Rudolphが示唆したように、コードで256やその他のマジックナンバーを使用するべきではありません。むしろstd::numeric_limits<std::streamsize>::max()
を使用してください。 _istream::ignore
_の最初の引数についてドキュメントが言っていることは次のとおりです。
抽出する(そして無視する)最大文字数。 これが正確に
numeric_limits<streamsize>::max()
の場合、制限はありません。delim(またはファイルの終わり)が見つかるまで、必要な数の文字が抽出されます。
_cin.ignore( std::numeric_limits<std::streamsize>::max(), '\n') ;
_
私の質問は、「フルネームをもう一度入力してください:」の後に改行がないのはなぜですか?
Stdoutに出力しておらず、ユーザーがEnterキーを押す機会がなかったためです。 getline
はバッファから_Smith\n
_を読み取り、すぐに続行します。改行文字はコンソールにエコーされません-getline
はそれを行いません。
もう一度フルネームを入力すると、突然改行が入ります。正直言って、それほど大きな問題ではありません。しかし、誰かが私を助けてくれるなら、何が起こったのかを知っていてもかまいません。ありがとう!
serがEnter
キーで入力するのは改行であり、プログラムからのものではありません。
編集通常(端末の設定に応じて)端末でEnterキーを押すと、いくつかの個別の処理が行われます。
\n
_を入力バッファーに挿入する