21

私のプログラムでユーザーに入力を求めているのに、次のようにする理由はありますか?

int number;
string str;
int accountNumber;

cout << "Enter number:";
cin >> number;
cout << "Enter name:";
getline(cin, str);
cout << "Enter account number:";
cin >> accountNumber;

最初の番号を入力した後、getline(cin, str) 行に「str」を入力する前に、「Enter Name」が出力され、すぐに「Enter Account Number」が続くのはなぜですか? ありがとう!

4

7 に答える 7

24

getline(cin, str);、前に読み取った番号の後に続く改行を読み取り、この「行」ですぐに戻ります。これを避けるためstd::wsに、名前を読む前に空白をスキップできます:

cout << "Enter number:";
cin >> number;
cout << "Enter name:";
ws(cin);
getline(cin, str);
...

これは、改行後の先頭の空白もスキップするためstr、ユーザーがスペースを入力したとしても、スペースで開始されないことに注意してください。しかし、この場合、それはおそらく機能であり、バグではありません...

于 2009-11-16T20:50:10.340 に答える
16

試す

cout << "Enter name:";
cin.ignore();
getline(cin, str);
于 2009-11-16T20:46:41.250 に答える
5

行ベースの読み取りが必要なようです。このため、おそらくgetline一貫して使用し、次に行から数値を解析する必要がある場合は各行を解析する必要があります。これにより、入力の読み取りがより一貫したものになります。

この方法では、次の読み取り操作が新しい行で開始されることを保証するために、各行の終わりを手動でスキャンする必要はありません。

また、入力要求を繰り返すためのエラー処理の追加も簡単になります。

例えば

#include <string>
#include <iostream>
#include <istream>
#include <ostream>
#include <sstream>

int parse_integer(const std::string& input)
{
    std::istringstream iss(input);
    int result;
    if (!(iss >> result))
    {
        // error - throw something?
    }
    return result;
}

int main()
{
    int number;
    std::string str;
    int accountNumber;

    std::string inputline;

    std::cout << "Enter number: ";

    if (!std::getline(std::cin, inputline))
    {
        // error - throw something?
    }

    number = parse_integer(inputline);

    std::cout << "Enter name:";

    if (!std::getline(std::cin, inputline))
    {
        // error - throw something?
    }

    str = inputline;

    std::cout << "Enter account number:";

    if (!std::getline(std::cin, inputline))
    {
        // error - throw something?
    }

    accountNumber = parse_integer(inputline);

    return 0;
}
于 2009-11-16T21:01:40.970 に答える
4
cin >> number

バッファから数値を取得するだけで、「Enter」をバッファに残します。これはすぐにgetlineによって取得され、空の文字列(または新しい行だけの文字列、忘れました)として解釈されます。

于 2009-11-16T20:44:09.243 に答える
2
cin >> number // eat the numeric characters
getline(cin, str) // eat the remaining newline
于 2009-11-16T20:36:53.610 に答える
2

cin >>問題は改行文字を渡すことだと思います(\n)。getline() は、改行文字が空白であると想定し、それを渡します。誰かがあなたが使用できるソリューションを投稿しました。

ダミーgetline(cin, dummy);または本物を使用できますcin.ignore(100,'\n');

于 2009-11-16T20:48:59.607 に答える