Ввод 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;
}

но я все еще получаю то же самое, пропуская ввод, и когда он принимает ввод, он берет их и сохраняет в имени пустое имя, а в адресе он берет то, что я написал в имени, но от 2-й буквы до конца

что не так с моим кодом?

Я попробовал 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');
}

Я снова выбираю 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 ответа

Решение

Если вы используете 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

Структура вашего кода меню является проблемой:

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.

Я столкнулся с этой проблемой и решил эту проблему, используя getchar(), чтобы поймать ('\n') новый символ

Здесь '\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;

Я думаю, что это решит проблему.

Другие вопросы по тегам