cin e getline pulando input

anteriormente eu postei uma pergunta sobre o cin jumping input, e obtive resultados para liberar e usar o istringstream , mas agora tentei todas as soluções possíveis, mas nenhuma delas funcionou.

aqui está o meu código:

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

mas eu ainda estou recebendo a mesma coisa, pulando a input, e quando isso leva input, eles pegam e armazenam no nome vazio nada, e no endereço ele pega o que eu escrevi no nome mas da 2ª carta até o fim

o que está errado com meu código?

Eu tentei o cin.ignore() , cin.get() e cin.clear() todos juntos e sozinhos, nenhum deles funcionou

EDITAR:

método principal em main.cpp invoca mainMenu() apenas

 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'); } 

Eu vou escolher 1 para o exemplo do cliente, isto é 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'); } 

Eu escolho 1 novamente para criar um novo object de cliente, que agora irá para o MainFunctions.cpp que invocará a function createNewCustomer() que é a primeira.

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

Se você estiver usando o getline após o cin >> something , você precisará liberar a nova linha do buffer entre elas.

Meu favorito pessoal para isso, se nenhum caractere após a nova linha for necessário, é cin.sync() . No entanto, é implementação definida, por isso pode não funcionar da mesma forma que para mim. Para algo sólido, use cin.ignore() . Ou faça uso de std::ws para remover espaços em branco iniciais, se desejável:

 int a; cin >> a; cin.ignore (std::numeric_limits::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 

A estrutura do seu código de menu é o problema:

 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. 

Aqui, o '\n' deixado pelo cin, está criando problemas.

 do { system("cls"); manageCustomerMenu(); cin >> choice; #This cin is leaving a trailing \n system("cls"); switch (choice) { case '1': createNewCustomer(); break; 

Isso \n está sendo consumido pela próxima getline em createNewCustomer() . Você deveria usar o getline –

 do { system("cls"); manageCustomerMenu(); getline(cin, choice) system("cls"); switch (choice) { case '1': createNewCustomer(); break; 

Eu acho que isso resolveria o problema.

Enfrentei esse problema e resolvi esse problema usando getchar () para capturar o novo caractere ‘\ n’