2012-02-23 13 views
6

Mi código es el siguiente,getline (cin, laCadena) que reciben de entrada sin otra ingresar

string aString; 
cin >> aString; 
cout << "This is what cin gets:" << aString << endl; 
getline(cin, aString); 
cout << "This is what getline(cin, <string>) gets:" << aString << endl; 

Cada vez que me encontré con él, le doy insumos como, "12", me sale "12" y "" .

Me pregunto por qué getline se recibiría sin la intervención del usuario.

Puedo entender cuando entro algo como "12 24", cin obtendrá "12", y getline debería hacer el resto. (Además, si se puede responder, el espacio intermedio se trata como un final para cin, entonces ¿por qué se pasa a getline?)

Recién comenzando en cadena en C++ así que por favor no lo haga demasiado difícil . Gracias.

+0

Si ya ha recibido la información, no hay nada más que obtener a menos que haya más información ... – AJG85

Respuesta

12

Cuando mezcla la extracción de flujo estándar con getline, a veces tendrá getline return the empty string. La razón para esto es que si lee la entrada con >>, el carácter de nueva línea ingresado por el usuario para indicar que está terminado no se elimina de la secuencia de entrada. En consecuencia, cuando llame a getline, la función leerá el carácter de nueva línea sobrante y devolverá la cadena vacía.

Para solucionar este problema, ya sea constantemente utilizan getline para su entrada o bien utiliza el manipulador de flujo ws para extraer espacio en blanco adicional después de una lectura:

cin >> value >> ws; 

Esto se comen el salto de línea, solucionar el problema.

Espero que esto ayude!

7

esto es lo que me pasa:

std::string str; 
std::cin >> str; //hello world 
std::cout << str; //hello 

esto se debe a que el operador corriente tokenizes en el espacio blanco

std::string str; 
std::getline(std::cin, str); //hello world 
std::cout << str; //hello world 

se obtiene la línea completa, getline() funciona hasta que encuentra el primer extremo de línea y devuelve ese valor como una cadena.

Sin embargo, al tokenizar, si quedan caracteres (por ejemplo, '\ n') en la transmisión, se accederá a ellos cuando se llame a getline, deberá borrar la secuencia.

std::cin.ignore(); 
1

"cin >> x" no consume el carácter de nueva línea de la secuencia de entrada, por lo que la siguiente línea que obtenga con getline contendrá una cadena vacía. Una forma de resolver esto es usar getline para recuperar entrada línea por línea y usar un stringstream para tokenizar cada línea. Después de haber extraído toda la información del flujo de cadenas, la clave es llamar a stringstream :: clear() para borrar el indicador EOF establecido en el flujo de cadenas para poder reutilizarlo más adelante en el código.

He aquí un ejemplo:

#include <iostream> 
#include <sstream> 
#include <string> 

using namespace std; 

int main() { 
    string line; 
    stringstream ss; 
    getline(cin, line); 
    ss << line; 
    int x, y, z; 
    //extract x, y, z and any overflow characters 
    ss >> x >> y >> z >> line; 
    ss.clear(); 
    //reuse ss after clearing the eof flag 
    getline(cin, line); 
    ss << line; 
    //extract new fields, then clear, then reuse 
    //... 
    return 0; 
} 

Dependiendo de la longitud de cada línea de entrada, recibiendo toda la línea a la vez y su procesamiento en memoria es probablemente más eficiente que haciendo consola IO en cada Token desea para extraer de la entrada estándar.

Cuestiones relacionadas