web-dev-qa-db-ja.com

基本的な文字列入力

ユーザーがコマンドプロンプトに文字列を入力できるようにするこのコードに出くわしました。私は彼らが何をしているのか知っています、そしてそれはすべて素晴らしいです。しかし、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 ;

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

9
user2779581

ご覧のとおり、最初に「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はそれを行いません。

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

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

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

  1. _\n_を入力バッファーに挿入する
  2. 入力バッファのフラッシュ
  3. 入力カーソルを1行下にシフト
  4. 入力カーソルを行頭に移動する
8
Nemanja Boric