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