2009-11-16 21 views
17

¿Existe una razón por la cual si en mi programa que estoy pidiendo al usuario para la entrada, y lo hago:¿Necesita ayuda con getline()

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 introducir el primer número, se da salida a "Introduce el nombre" , seguido inmediatamente por "Ingresar número de cuenta" antes de que llegue a ingresar mi "str" ​​para la línea getline (cin, str)? ¡Gracias!

+0

posible duplicado de [¿Qué no estoy comprensión acerca de + cuerdas getline?] (Http://stackoverflow.com/questions/8248239/what-am-i-not-understanding-about-getlinestrings) –

+0

Posible duplicado de [¿Por qué std :: getline() omite la entrada después de una extracción formateada?] (http://stackoverflow.com/questions/21567291/why-does-stdgetline-skip-input-after-a-formatted-extraction) –

Respuesta

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

sólo se agarra los números de la memoria intermedia, que deja el "enter" en el buffer, que es inmediatamente agarró por el getline y se interpreta como una cadena vacía (o cadena con sólo el nuevo línea, lo olvido).

+1

cin >> número, ¿no? – pmr

+0

Sí, lo escribió mal, eso es todo. – Secko

+0

@Secko Sí, y eso es exactamente lo que quería comunicar. Me disculpo si parece ser grosero. – pmr

12

Trate

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

Creo que el problema es que cin >> pases en 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 utilizar un maniquí getline(cin, dummy); o la cosa real cin.ignore(100,'\n');

16

El getline(cin, str); lee la nueva línea que viene después de leer el número anteriormente, e inmediatamente regresa con esta "línea". Para evitar esto se 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 se salta espacios en blanco, después de que el salto de línea, por lo que no str comenzará con espacios, incluso si el usuario hizo entrada de ellos. Pero en este caso, probablemente sea una característica, no un error ...

+0

Tenga en cuenta que este método no permitirá que el usuario ingrese una línea vacía. – interjay

4

Parece que quiere leer en línea. Para esto, probablemente desee utilizar getline de forma 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 manera no tiene que buscar 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 el manejo de errores de adición para repetir 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; 
} 
Cuestiones relacionadas