0

重複の可能性:
プログラムはユーザー入力を取得せずに Getline() をスキップしています

さて、実行中のプログラムがあり、開始時にデータメンバーにデータを入力するように求められます。プログラムは、3 つの異なるオブジェクトに対してこれを行います。

私の問題は、実行時に最初のオブジェクトのデータを入力した後、プログラムが 2 番目の名前の入力をスキップし、次のオプションに直接進むことです。3 番目のオプションの名前についても同じことが行われます。また、データを変更する機会が得られたときにもこれを行います。

「CD 名を入力してください: Microsoft Word

1ゲーム

2ワード

3-コンパイラ

4-スプレッドシート

5Dベース

6-プレゼンテーション

CD のタイプに対応する番号を入力してください: 2

入力 CD コスト: 15.23

Enter CD Name: 1-Game <- ((入力部分をスキップして、直接メニューに移動します!))

2ワード

3-コンパイラ

4-スプレッドシート

5Dベース

6-プレゼンテーション

CD のタイプに対応する番号を入力してください:"

問題はメンバー関数にある可能性が最も高いですが、何が問題なのかわかりません。

これが私のメンバー関数コードです:

void CDX::LoadInfo() //Prompts, validates and sets data members
{
cout << "Enter CD Name: ";
getline(cin, Name);

int choice=0;
do
{   cout << "1-Game\n2-Word\n3-Compiler\n4-Spreadsheet\n5-Dbase\n6-Presentation" << endl;
    cout << "Enter the number that corresponds with the CD's Type: ";
    cin >> choice;
} while ((choice <1)||(choice>6));

switch(choice)
//Code for case-switch statement goes here)

それで、私は何が欠けていますか?これはバッファの問題ですか、それともスキップする原因となる何らかの方法でコードを途中で終了していますか?

4

3 に答える 3

1

変換できない文字が見つかると、数値の変換は停止します。その場合、文字は'\n'です

getlineを使用して行を読み取る場合、この文字は読み取られて破棄されますが、数値を読み取ると(数値が継続するかどうかを知るために)読み取られ、数値の一部でない場合はそのままになります。次の読み取り用のバッファ。

例:「29312」と入力してEnterキーを押すと、バッファは「29312\n」でいっぱいになります。

cin >> numberを使用してstdinを読み取る場合、数字は消費されますが、バッファには「\n」が残ります。次回getlineを呼び出すと、バッファに残っていた空の行が読み取られます。

于 2012-10-26T18:27:24.367 に答える
0

最初の 'getline(cin, Name)' が最後の改行キーを飲み込んでしまうためだと思います。コストを入力して ENTER を押すと、 への呼び出しgetlineが完了します。

getline改行を消費するように、コストを取った後に余分なものを保持できます。その後、正常に動作すると思います。

于 2012-10-26T18:23:18.460 に答える
0

「CD コスト」を読みましたが、入力バッファに改行が残っています。CD 名を読み取る前に空白をスキップします。

ws(cin);
于 2012-10-26T18:23:20.220 に答える