input cin e getline skipping

prima ho postato una domanda sull’input di cin skipping, e ho ottenuto risultati per il flush, e uso istringstream , ma ora ho provato ogni ansible soluzione, ma nessuna di esse funziona.

ecco il mio codice:

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

ma sto ancora ottenendo la stessa cosa, saltando input, e quando prende input, li prende e memorizza in nome nulla vuoto, e in address prende ciò che ho scritto di nome ma dalla 2 lettera alla fine

cosa c’è che non va nel mio codice?

Ho provato cin.ignore() , cin.get() e cin.clear() tutti insieme e da soli, nessuno di loro ha funzionato

MODIFICARE:

il metodo main in main.cpp richiama solo 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'); } 

sceglierò 1 per l’esempio del cliente, questo è 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'); } 

Scelgo nuovamente 1 per creare un nuovo object cliente, che ora andrà al MainFunctions.cpp che invocherà la funzione createNewCustomer() che è la prima.

 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 stai usando getline after cin >> something , devi svuotare la newline dal buffer in mezzo.

Il mio preferito per questo se non ci sono caratteri che cin.sync() la nuova riga è necessario cin.sync() . Tuttavia, è definita dall’implementazione, quindi potrebbe non funzionare allo stesso modo che per me. Per qualcosa di solido, usa cin.ignore() . Oppure fai uso di std::ws per rimuovere gli spazi bianchi iniziali se lo desideri:

 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 

La struttura del codice menu è il 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. 

Qui, il '\n' lasciato da cin, sta creando problemi.

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

Questo \n viene utilizzato dalla prossima linea in createNewCustomer() . Dovresti usare invece getline –

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

Penso che questo risolva il problema.

Ho affrontato questo problema e risolto questo problema utilizzando getchar () per catturare il nuovo carattere (‘\ n’)