1. ホーム
  2. c++

[解決済み] cinとgetlineが入力をスキップする [重複]。

2022-02-11 17:08:21

質問

以前、私は次のような質問を投稿しました。 cin 入力をスキップして、フラッシュする結果を得ました。 istringstream しかし、今、私はすべての可能な解決策を試してみましたが、それらのどれも動作しません。

以下は私のコードです。

void createNewCustomer () {
    string name, address;

    cout << "Creating a new customer..." << endl;
    cout << "Enter the customer's name: "; getline(cin, name);
    cout << "Enter the customer's address: "; getline(cin, address);

    Customer c(name, address, 0);
    CustomerDB::addCustomer(c);

    cout << endl;
}

しかし、私はまだ同じことを得る、入力をスキップし、それが入力を取るとき、それはそれらを取り、名前に空の何も格納しません、そしてアドレスは、私が名前に書いたものを取るが、2文字目から最後までの

私のコードに何か問題があるのでしょうか?

を試してみました。 cin.ignore() , cin.get() および cin.clear() 全部一緒にしても、全部単独にしても、どれもうまくいかなかった。

EDIT

main.cppのmainメソッドが呼び出す mainMenu() のみ

void mainMenu () {
    char choice;

    do {
        system("cls");
        mainMenuDisplay();
        cin >> choice;
        system("cls");

        switch (choice) {
            case '1':
                customerMenu();
                break;

            case '2':
                dvdMenu();
                break;

            case '3':
                receiptMenu();
                break;

            case '4':
                outro();
                break;

            default:
                cout << '\a';
        }

        cin.ignore();
        cin.get();
    } while (choice != '4');
}

お客様の例として、1を選びます。 customerMenu()

void customerMenu () {
    char choice;

    do {
        system("cls");
        manageCustomerMenu();
        cin >> choice;
        system("cls");

        switch (choice) {
            case '1':
                createNewCustomer();
                break;

            case '2':
                deleteCustomer();
                break;

            case '3':
                updateCustomerStatus();
                break;

            case '4':
                viewCustomersList();
                break;

            case '5':
                mainMenu();
                break;

            default:
                cout << '\a';
        }

        cin.ignore();
        cin.get();
    } while (choice != '5');
}

再び1を選んで新しい顧客オブジェクトを作成し、MainFunctions.cppに移動して関数を呼び出すと、そのオブジェクトは次のようになります。 createNewCustomer() というものです。

void createNewCustomer () {
    string name, address;

    cout << "Creating a new customer..." << endl;
    cout << "Enter the customer's name: "; cin.getline(name,256);
    cout << "Enter the customer's address: "; cin.getline(address,256);

    Customer c(name, address, 0);
    CustomerDB::addCustomer(c);

    cout << endl;
}

解決方法は?

を使用している場合 getline の後に cin >> something の場合、その間にあるバッファから改行をフラッシュする必要があります。

改行以降の文字が必要ない場合、私が個人的に気に入っているのは cin.sync() . しかし、これは実装で定義されているので、私の場合と同じようには動作しないかもしれません。しっかりしたものを作りたい場合は cin.ignore() . または std::ws を使用して、必要であれば先頭の空白を削除します。

int a;

cin >> a;
cin.ignore (std::numeric_limits<std::streamsize>::max(), '\n'); 
//discard characters until newline is found

//my method: cin.sync(); //discard unread characters

string s;
getline (cin, s); //newline is gone, so this executes

//other method: getline(cin >> ws, s); //remove all leading whitespace