Tengo un problema con getline método para obtener un mensaje de que los tipos de usuario, estoy usando algo como:

string messageVar;
cout << "Type your message: ";
getline(cin, messageVar);

Sin embargo, no se detuvo para obtener el valor de salida, ¿qué hay de malo con esto?

  • No hay nada de malo con las tres líneas que se muestran. Deberías editar tu pregunta para incluir algo más de contexto?
  • stackoverflow.com/search?q=%5Bc%2B%2B%5D%20getline%20skipping
  • Es este todo el código? Qué haces nada con messageVar después?
  • Más probable es que hay un '\n' a la izquierda en la secuencia de la entrada anterior.
  • Sí, me registre el valor en DB, yo estaba usando cin >> messageVar, pero eso es sólo la captura de la «palabra por palabra» de la sentencia
InformationsquelleAutor MGE | 2013-09-13

6 Comentarios

  1. 86

    Si usted está usando getline() después de cin >> something, usted necesita lavar el carácter de nueva línea de búfer en el medio. Usted puede hacer esto mediante el uso de cin.ignore().

    Sería algo como esto:

    string messageVar;
    cout << "Type your message: ";
    cin.ignore(); 
    getline(cin, messageVar);

    Esto sucede porque el >> operador hojas de una nueva línea \n de caracteres en el búfer de entrada. Esto puede convertirse en un problema cuando usted hace sin formato de entrada, como getline(), que lee de la entrada hasta que un carácter de nueva línea se encuentra. Que esto suceda, va a dejar de leer de inmediato, debido a que \n que quedó colgando en la operación anterior.

    • ¿Qué es un «formato de entrada» y cómo se relaciona con getline()?
    • También, hay una forma alternativa de lograr el mismo comportamiento que el código sin tener que usar el cin,cin.ignore(), y getline() funciones?
  2. 6

    Si sólo tiene un único salto de línea en la entrada, sólo haciendo

    std::cin.ignore();

    funcionará bien. Lee y descarta el siguiente carácter de la entrada.

    Pero si usted tiene algo más todavía en la entrada, además de la nueva línea (por ejemplo, leer una palabra pero que el usuario entró en dos palabras), entonces usted tiene que hacer

    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

    Ver, por ejemplo,esta referencia de la ignore función.

    A ser incluso más segura, la segunda alternativa de arriba en un bucle hasta que gcount devuelve cero.

  3. 3

    He tenido problemas similares. El único inconveniente es que con cin.ignore(), usted tiene que pulsar enter 1 vez más, que se mete con el programa.

  4. 2
    int main(){
    .... example with file
         //input is a file
        if(input.is_open()){
            cin.ignore(1,'\n'); //it ignores everything after new line
            cin.getline(buffer,255); //save it in buffer
            input<<buffer; //save it in input(it's a file)
            input.close();
        }
    }
  5. -1

    creo que no son de poner en pausa el programa antes de que terminara de modo que el resultado que usted está poniendo después de conseguir la inpus no es ver en la pantalla de la derecha?

    hacer:

    getchar();

    antes de la finalización del programa de

    • Supongo que esta respuesta es para Windows, que normalmente termina la consola tras el retorno. Creo que no se aplica a la pregunta?
  6. -1

    El código es correcto. El problema debe estar en algún otro lugar. Pruebe el minimalista ejemplo de la std::getline documentación.

    main ()
    {
        std::string name;
    
        std::cout << "Please, enter your full name: ";
        std::getline (std::cin,name);
        std::cout << "Hello, " << name << "!\n";
    
        return 0;
    }
    • He probado el código, la entrada se inserta en el name objeto, pero no se puede usar para imprimir el hello name. Alguna idea?
    • Seguro, usted puede. Yo sólo lo probé y funciona muy bien. Exactamente lo que hace que no funcione para usted?
    • No, no se trata de eso. El problema, como se describe por la gente de arriba es que cuando el getline() sigue a otra entrada con cin todavía hay un salto de línea en el búfer de entrada. El mínimo ejemplo dado no tiene ninguna entrada anterior el getline() y por supuesto, no reproducir el problema que el cartel original es preguntar acerca de.

Dejar respuesta

Please enter your comment!
Please enter your name here