Подтвердить что ты не робот

Вход cin и getline

ранее я разместил вопрос о cin пропуске ввода, и я получил результаты для очистки и использовал istringstream, но теперь я пробовал все возможные решения, но никто из них не работает.

вот мой код:

void createNewCustomer () {
    string name, address;

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

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

    cout << endl;
}

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

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

Я попробовал cin.ignore(), cin.get() и cin.clear() все их вместе и один, ни один из них не работал

EDIT:

Основной метод в 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');
}

i выберет 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 name: "; cin.getline(name,256);
    cout << "Enter the customer address: "; cin.getline(address,256);

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

    cout << endl;
}
4b9b3361

Ответ 1

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

Ответ 2

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

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.

Ответ 3

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

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

Ответ 4

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