48

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()

編集:

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;
}
4

4 に答える 4

86

getlineafterを使用している場合は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
于 2012-05-11T14:58:25.410 に答える
16

メニューコードの構造が問題です。

cin >> choice;   // new line character is left in the stream

 switch ( ... ) {
     // We enter the handlers, '\n' still in the stream
 }

cin.ignore();   // Put this right after cin >> choice, before you go on
                // getting input with getline.
于 2012-05-11T15:09:47.447 に答える
2

ここで、'\n'cinの左が問題を引き起こしています。

do {
    system("cls");
    manageCustomerMenu();
    cin >> choice;               #This cin is leaving a trailing \n
    system("cls");

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

これ\nは、の次のgetlineによって消費されていcreateNewCustomer()ます。代わりにgetlineを使用する必要があります-

do {
    system("cls");
    manageCustomerMenu();
    getline(cin, choice)               
    system("cls");

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

これで問題は解決すると思います。

于 2012-05-11T15:04:38.750 に答える
2

私はこの問題に直面し、getchar()を使用して('\ n')の新しい文字をキャッチすることでこの問題を解決しました

于 2014-12-11T09:35:24.587 に答える