variable dev c++ getline

c++ - dev - Necesita ayuda con getline()



getline(cin variable) (6)

Creo que el problema es que cin >> pasa el carácter de nueva línea (/n) . El getline () asume que el carácter de nueva línea es un espacio en blanco y lo pasa. Alguien publicó una solución que puedes usar.

Puede usar una línea ficticia getline(cin, dummy); o lo real cin.ignore(100,''/n'');

¿Hay alguna razón por la cual si en mi programa le pido al usuario su opinión, y lo hago?

int number; string str; int accountNumber; cout << "Enter number:"; cin >> number; cout << "Enter name:"; getline(cin, str); cout << "Enter account number:"; cin >> accountNumber;

¿Por qué después de ingresar el primer número, se emite "Ingresar nombre", seguido de inmediato por "Ingresar número de cuenta" incluso antes de ingresar mi "str" ​​para la línea getline (cin, str)? ¡Gracias!


El getline(cin, str); lee la nueva línea que viene después del número leído anteriormente, y regresa inmediatamente con esta "línea". Para evitar esto, puede omitir el espacio en blanco con std::ws antes de leer el nombre:

cout << "Enter number:"; cin >> number; cout << "Enter name:"; ws(cin); getline(cin, str); ...

Tenga en cuenta que esto también omite los espacios en blanco iniciales después de la línea nueva, por lo que str no comenzará con espacios, incluso si el usuario los ingresó. Pero en este caso, esa es probablemente una característica, no un error ...


Parece que quieres leer en línea. Para esto, probablemente desee utilizar getline consistente y luego analizar cada línea si necesita analizar un número desde la línea de lectura. Hace que la lectura de entrada sea más consistente.

De esta forma, no tiene que escanear manualmente el final de cada línea para garantizar que la siguiente operación de lectura comience en una línea nueva.

También simplifica la adición de manejo de errores para repetir las solicitudes de entrada.

p.ej

#include <string> #include <iostream> #include <istream> #include <ostream> #include <sstream> int parse_integer(const std::string& input) { std::istringstream iss(input); int result; if (!(iss >> result)) { // error - throw something? } return result; } int main() { int number; std::string str; int accountNumber; std::string inputline; std::cout << "Enter number: "; if (!std::getline(std::cin, inputline)) { // error - throw something? } number = parse_integer(inputline); std::cout << "Enter name:"; if (!std::getline(std::cin, inputline)) { // error - throw something? } str = inputline; std::cout << "Enter account number:"; if (!std::getline(std::cin, inputline)) { // error - throw something? } accountNumber = parse_integer(inputline); return 0; }


Tratar

cout << "Enter name:"; cin.ignore(); getline(cin, str);


cin >> number // eat the numeric characters getline(cin, str) // eat the remaining newline


cin >> number

solo toma los números del búfer, deja "enter" en el búfer, que luego es capturado inmediatamente por la línea get e interpretado como una cadena vacía (o cadena con solo la nueva línea, lo olvido).