9

ユーザーがコマンドプロンプトで文字列を入力できるようにするこのコードを見つけました。私は彼らが何をするかを知っています、そしてそれはすべて素晴らしいです。しかし、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はまだ入力バッファから読み取っていて、それを修正する方法を知っています. 私の質問は、「Please enter your full name again:」の後に改行がないのはなぜですか? コードを次のように変更すると:

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 ;

フルネームをもう一度入力すると、突然改行が表示されます。正直なところ、それほど大きな問題ではありません。しかし、誰かが私を助けてくれるなら、何が起こったのかを知ってもかまいません. ありがとう!

4

1 に答える 1

8

ご覧のとおり、最初に「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') ;

私の質問は、「Please enter your full name again:」の後に改行がないのはなぜですか?

標準出力に出力していないため、ユーザーは Enter キーを押す機会がありませんでした。getlineバッファから読み取りSmith\n、すぐに続行します。改行文字をコンソールにエコーgetlineしません-そうしません。

フルネームをもう一度入力すると、突然改行が表示されます。正直なところ、それほど大きな問題ではありません。しかし、誰かが私を助けてくれるなら、何が起こったのかを知ってもかまいません. ありがとう!

ユーザーがキーで入力するのは改行でありEnter、プログラムからのものではありません。

編集通常、端末で Enter キーを押すと (端末の設定によって異なります)、いくつかの個別の処理が行われます。

  1. \n入力バッファへの挿入
  2. 入力バッファのフラッシュ
  3. 入力カーソルを 1 行下にシフトする
  4. 入力カーソルを行頭に移動する
于 2013-09-14T16:58:04.853 に答える