可能性のある複製:
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 the full name of student:
Age: 20
Father's Name:
Permanent Address: xyz
あなたが気づいた場合、プログラムは私にフルネームを尋ねるのではなく、直接年齢を尋ねてきました。次に、父親の名前もスキップし、本籍地を尋ねます。 これの理由は何ですか?
コードが大きすぎるため、コード全体を投稿するのは難しいです。
コードを投稿していないため。推測してみましょう。
getline
をcin
とともに使用する場合の一般的な問題はgetline
であり、先頭の空白文字が無視されません。
Getlineが_cin >>
_の後に使用された場合、getline()
はこの改行文字を先頭の空白として認識し、それ以上の読み取りを停止します。
解決方法
cin.ignore()
を呼び出す前にgetline()
を呼び出します
または
ダミーの呼び出しgetline()
を実行して、_cin >>
_の末尾の改行文字を消費します
問題は、getline
とcin >>
入力を混在させていることです。
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 );
_cin >> age ;
_行の後、入力バッファーに改行文字_\n
_が残っています(Enterキーを押して値を入力したため)。これを修正するには、cin.ignore();
の後に行を追加しますintを読み取ります。