2

ループを使用して配列に文字列を入力しようとしています。私の問題は、名前を入力するためにループに入ると、ベクトルの最初のスロットに空白行が即座に入力されることです。なぜこれが起こるのですか?そして、どうすれば修正できますか。私のコードスタイルの欠如を気にしないでください、私は今年の冬にクラスを始める前にプログラミングの知識を取り戻そうとしている初心者です...

出力例を次に示します。

How many people are in your family?
4
Please enter the names of all of your family members
check name:
Please enter the names of all of your family members
Matt
check name:Matt
Please enter the names of all of your family members
Evan
check name:Evan
Please enter the names of all of your family members
Michelle
check name:Michelle

Matt
Evan
Michelle

これは私のコードです:

vector<string> Names;
bool complete=0;
while(!complete)
{
    int number;
    cout << "How many people are in your family?" << endl;
    cin >> number;

    for(int i=0; i<number; i++)
    {
        string names;
        cin.clear();
        cout << "Please enter the names of all of your family members" << endl;
        getline(cin,names);
        Names.push_back(names);
        cout << "check name:" << names << endl;
    }
    complete = 1;
}

for (int i=0; i< Names.size(); i++)
{
    cout << Names[i] << endl;
}
4

3 に答える 3

2

この動作が見られる理由は、>>読み取りと getline が混在しているためです。カウントを読み取ると、入力ポインタは数値入力の末尾、つまり 4 まで進み、改行文字が読み取られる直前で停止します。

これはあなたが呼び出すときですgetline; 改行文字が読み取られ、改行がすぐに返されます。

この問題を解決するには、呼び出しgetlineの直後に呼び出しを追加しcin >> number、結果を破棄します。

于 2013-01-07T02:16:12.930 に答える
1

std::cin >> number問題は、フォーマットされた入力 ( ) とフォーマットされていない入力 ( ) を混在させることですstd::getline(std::cin, names)。フォーマットされた入力は、最初の非整数文字で停止します。最も可能性が高いのは、カウントの後に入力した改行です。最も簡単な修正は、先頭の空白を明示的にスキップすることです:

std::getline(std::cin >> std::ws, names);

各入力の後に、成功したことも確認する必要があることに注意してください。

if (std::cin >> number) {
    // do something after a successful read
}
于 2013-01-07T02:25:53.577 に答える
1

試してみることをお勧めしますか

std::cin >> names;

それ以外の

getline(std::cin, names);

getline は、印刷文字列からstd::endlまたは を受け取ります。アイデアは、getline が文字 (エンドラインの表示) まで読み取ることですが、エンドライン文字も消費します。これが改行文字をベクトルに消費する理由です。\nstd::cout\n

これを行うことを検討してください。. .

std::cin.get();

文字を読み取りstd::endl、getline 関数を使用します。

于 2013-01-07T02:11:18.103 に答える