significa que c++ input getline cin

c++ - que - Cin y Getline saltando entrada



que significa endl en c++ (4)

Aquí, la ''/n'' dejada por cin, está creando problemas.

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

Esto /n está siendo consumido por la siguiente getline en createNewCustomer() . Deberías usar getline en su lugar -

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

Creo que esto resolvería el problema.

Esta pregunta ya tiene una respuesta aquí:

Anteriormente publiqué una pregunta sobre la entrada de omisión de istringstream , obtuve resultados para istringstream y uso de istringstream , pero ahora probé todas las soluciones posibles, pero ninguna de ellas funciona.

aquí está mi 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; }

pero sigo recibiendo lo mismo, omitiendo la entrada, y cuando toma la entrada, los toma y almacena en el nombre nada vacío, y en la dirección toma lo que escribí en el nombre pero desde la segunda letra hasta el final

¿Qué pasa con mi código?

cin.ignore() el cin.ignore() , cin.get() , y cin.clear() todos juntos y solos, ninguno funcionó

EDITAR:

método principal en main.cpp invoca mainMenu() solamente

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

elegiré 1 para el ejemplo del cliente, este es 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''); }

Elijo 1 nuevamente para crear un nuevo objeto de cliente, que ahora irá a MainFunctions.cpp que invocará la función createNewCustomer() que es la primera.

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


Enfrenté este problema y resolví este problema usando getchar () para capturar el (''/ n'') nuevo char


La estructura de su código de menú es el 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.


Si está usando getline después de cin >> something , necesita eliminar la línea nueva del buffer intermedio.

Mi favorito personal para esto si no se necesitan caracteres más allá de la nueva línea es cin.sync() . Sin embargo, está definida su implementación, por lo que podría no funcionar de la misma manera que lo hace para mí. Para algo sólido, use cin.ignore() . O utilice std::ws para eliminar los espacios en blanco iniciales si lo desea:

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