2012-09-19 21 views
5

Estoy en el laboratorio de computación y ninguno de los tutores puede averiguar por qué mi getline no funciona correctamente. No está almacenando la información correctamente (solo almacena 1 o 2 letras). ¿Alguien sabe por qué esto es así?¿Por qué Getline es tan inconsistente?

void addMovie(Inventory movie[], int &count) 
{ 
    string s; 
    int i; 

    cout << "Please enter the SKU " << endl; 
    cin >> i; 
    movie[count].sku = i; 

    cout << "Please enter the name of the movie you wish to add " << endl; 

    cin.ignore('\n'); 
    getline(cin, s, '\n'); 
    movie[count].title = s; 

    count++; 
} 
+2

Como nota, es probable que debe utilizar algún tipo de contenedor estándar de una matriz C-estilo. No parece que estés haciendo ningún tipo de control aquí. – tadman

+0

No tiene que poner '' \ n'' en 'getline' tampoco. Es el delimeter por defecto. – chris

Respuesta

8

std::istream::ignore (es decir cin.ignore()) 's primer argumento es el número de caracteres de desprenderse. El valor de '\n' tiene un código ASCII de 10, por lo que '\n' se convierte implícitamente en un entero (probablemente 10, pero podría diferir si se usa una codificación diferente - EBCDIC usa 21), y esa es la cantidad de caracteres que se ignoran , dejando algunas sobras.

lo que realmente quiere es descartar el número máximo posible hasta que encuentre una nueva línea:

#include <limits> //for numeric_limtis 
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
+0

¿No debería haber advertido el compilador sobre esta conversión implícita? –

+0

@muntoo, No, es una conversión común bien definida por el estándar. C++ no diferencia '' int' y 'char' como tipos separados que requieren la seguridad del usuario para convertir, como lo hace algo como Java, por lo que ambos pueden usarse indistintamente. Puedes ver esto en funciones como 'tolower', que toma y devuelve un' int'. Sin embargo, ese proviene de C, como creo. Todo el asunto entre ints y chars podría provenir de C, pero no puedo recordarlo. Probablemente hay una buena discusión sobre esto en algún lugar en SO. – chris

+0

@muntoo, solo para señalar un ejemplo, esta es una excelente razón para que 'std :: string' no tenga un constructor que tenga un solo carácter. Si hiciera 'std :: string str (10);' esperando una cadena con una longitud de 10, se convertiría implícitamente en un char y usaría eso en su lugar. También funciona al revés. Otra cosa que acabo de recordar es que los literales de caracteres de C tenían el tipo 'int', not' char'. Olvidé si C tenía 'char' para entonces, pero incluso si lo tuviera, algo como' tolower' tendría que convertir el carácter literal a 'char' primero. – chris