CIN和getline跳过输入

CIN和getline跳过输入

早些时候我发布了一个关于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;}

但是我仍然得到同样的东西,跳过输入,当它接受输入时,它接受它们并以名义存储空的任何东西,在地址上它需要我写的名字,但是从第二封信到结尾

我的密码怎么了?

我试过cin.ignore()cin.get(),和cin.clear()他们都孤零零地在一起,没有人工作。

编辑:

main.cpp调用的主要方法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');}



阿波罗的战车
浏览 678回答 3
3回答

汪汪一只猫

如果你用getline后cin >> something,您需要在中间从缓冲区中清除换行符。如果不需要超过换行符的字符,我个人最喜欢的是cin.sync()..但是,它是定义的实现,所以它的工作方式可能与对我不同。对于实心的东西,请使用cin.ignore()..或利用std::ws如果需要的话,移除前导空格:int&nbsp;a;cin&nbsp;>>&nbsp;a;cin.ignore&nbsp;(std::numeric_limits<std::streamsize>::max(),&nbsp;'\n');&nbsp; //discard&nbsp;characters&nbsp;until&nbsp;newline&nbsp;is&nbsp;found//my&nbsp;method:&nbsp;cin.sync();&nbsp;//discard&nbsp;unread&nbsp;charactersstring&nbsp;s;getline&nbsp;(cin,&nbsp;s); &nbsp;//newline&nbsp;is&nbsp;gone,&nbsp;so&nbsp;this&nbsp;executes//other&nbsp;method:&nbsp;getline(cin&nbsp;>>&nbsp;ws,&nbsp;s);&nbsp;//remove&nbsp;all&nbsp;leading&nbsp;whitespace

慕田峪4524236

菜单代码的结构是问题所在:cin&nbsp;>>&nbsp;choice;&nbsp;&nbsp;&nbsp;//&nbsp;new&nbsp;line&nbsp;character&nbsp;is&nbsp;left&nbsp;in&nbsp;the&nbsp;stream &nbsp;switch&nbsp;(&nbsp;...&nbsp;)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;We&nbsp;enter&nbsp;the&nbsp;handlers,&nbsp;'\n'&nbsp;still&nbsp;in&nbsp;the&nbsp;stream &nbsp;}cin.ignore();&nbsp;&nbsp;&nbsp;//&nbsp;Put&nbsp;this&nbsp;right&nbsp;after&nbsp;cin&nbsp;>>&nbsp;choice,&nbsp;before&nbsp;you&nbsp;go&nbsp;on &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;getting&nbsp;input&nbsp;with&nbsp;getline.

慕沐林林

在这里,'\n'由CIN留下的,正在制造问题。do&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;system("cls"); &nbsp;&nbsp;&nbsp;&nbsp;manageCustomerMenu(); &nbsp;&nbsp;&nbsp;&nbsp;cin&nbsp;>>&nbsp;choice;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#This&nbsp;cin&nbsp;is&nbsp;leaving&nbsp;a&nbsp;trailing&nbsp;\n &nbsp;&nbsp;&nbsp;&nbsp;system("cls"); &nbsp;&nbsp;&nbsp;&nbsp;switch&nbsp;(choice)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;'1': &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;createNewCustomer(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;这,这个\n中的下一个getline正在使用createNewCustomer()..你应该用getline代替-do&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;system("cls"); &nbsp;&nbsp;&nbsp;&nbsp;manageCustomerMenu(); &nbsp;&nbsp;&nbsp;&nbsp;getline(cin,&nbsp;choice)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;system("cls"); &nbsp;&nbsp;&nbsp;&nbsp;switch&nbsp;(choice)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;'1': &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;createNewCustomer(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;我认为这样可以解决问题。
打开App,查看更多内容
随时随地看视频慕课网APP