web-dev-qa-db-ja.com

getlineが正しく動作していませんか?その理由は何でしょうか?

可能性のある複製:
getlineは入力を要求しませんか?

私のプログラムでいくつかのユニークなことが起こっています。コマンドのセットは次のとおりです。

 cout << "Enter the full name of student: ";  // cin name
 getline( cin , fullName );

 cout << "\nAge: ";  // cin age
 int age;
 cin >> age ;

cout << "\nFather's Name: ";  // cin father name
getline( cin , fatherName );

cout << "\nPermanent Address: ";  // cin permanent address
getline( cin , permanentAddress );

このスニペットをコード全体と一緒に実行しようとすると、出力プログラムは次のように機能します。

enter image description here

出力:

Enter the full name of student:
Age: 20

Father's Name:
Permanent Address: xyz

あなたが気づいた場合、プログラムは私にフルネームを尋ねるのではなく、直接年齢を尋ねてきました。次に、父親の名前もスキップし、本籍地を尋ねます。 これの理由は何ですか?

コードが大きすぎるため、コード全体を投稿するのは難しいです。

21
Suhail Gupta

コードを投稿していないため。推測してみましょう。

getlinecinとともに使用する場合の一般的な問題はgetlineであり、先頭の空白文字が無視されません。

Getlineが_cin >>_の後に使用された場合、getline()はこの改行文字を先頭の空白として認識し、それ以上の読み取りを停止します。

解決方法

cin.ignore()を呼び出す前にgetline()を呼び出します

または

ダミーの呼び出しgetline()を実行して、_cin >>_の末尾の改行文字を消費します

58
Alok Save

問題は、getlinecin >>入力を混在させていることです。

cin >> age;を実行すると、入力ストリームから経過時間が取得されますが、ストリームに空白が残ります。具体的には、入力ストリームに改行を残し、次のgetline呼び出しで空行として読み込まれます。

解決策は、入力を取得するためにgetlineのみを使用し、必要な情報の行を解析することです。

または、コードを修正するには、次のようにします。 (まだエラーチェックコードを自分で追加する必要があります):

cout << "Enter the full name of student: ";  // cin name
getline( cin , fullName );

cout << "\nAge: ";  // cin age
int age;
{
    std::string line;
    getline(cin, line);
    std::istringstream ss(line);
    ss >> age;
}

cout << "\nFather's Name: ";  // cin father name
getline( cin , fatherName );

cout << "\nPermanent Address: ";  // cin permanent address
getline( cin , permanentAddress );
3

_cin >> age ;_行の後、入力バッファーに改行文字_\n_が残っています(Enterキーを押して値を入力したため)。これを修正するには、cin.ignore();の後に行を追加しますintを読み取ります。

1
lccarrasco