entrada de salto de cin y getline [duplicate]

5 minutos de lectura

entrada de salto de cin y getline duplicate
hakuna matata

antes publiqué una pregunta sobre cin omitiendo la entrada, y obtuve resultados para vaciar y usar istringstreampero ahora probé todas las soluciones posibles pero ninguna de ellas funcionó.

aquí está mi código:

void createNewCustomer () {
    string name, address;

    cout << "Creating a new customer..." << endl;
    cout << "Enter the customer's name: "; getline(cin, name);
    cout << "Enter the customer's address: "; getline(cin, address);

    Customer c(name, address, 0);
    CustomerDB::addCustomer(c);

    cout << endl;
}

pero sigo obteniendo lo mismo, omitiendo la entrada, y cuando toma la entrada, los toma y almacena en el nombre nada vacío, y en la dirección toma lo que escribí en el nombre pero desde la segunda letra hasta el final

¿Qué está mal con mi código?

Probé el cin.ignore(), cin.get()y cin.clear() todos juntos y solos, ninguno trabajaba

EDITAR:

método principal en main.cpp invoca mainMenu() solamente

void mainMenu () {
    char choice;

    do {
        system("cls");
        mainMenuDisplay();
        cin >> choice;
        system("cls");

        switch (choice) {
            case '1':
                customerMenu();
                break;

            case '2':
                dvdMenu();
                break;

            case '3':
                receiptMenu();
                break;

            case '4':
                outro();
                break;

            default:
                cout << '\a';
        }

        cin.ignore();
        cin.get();
    } while (choice != '4');
}

elegiré 1 para el ejemplo del cliente, este es customerMenu()

void customerMenu () {
    char choice;

    do {
        system("cls");
        manageCustomerMenu();
        cin >> choice;
        system("cls");

        switch (choice) {
            case '1':
                createNewCustomer();
                break;

            case '2':
                deleteCustomer();
                break;

            case '3':
                updateCustomerStatus();
                break;

            case '4':
                viewCustomersList();
                break;

            case '5':
                mainMenu();
                break;

            default:
                cout << '\a';
        }

        cin.ignore();
        cin.get();
    } while (choice != '5');
}

Elijo 1 nuevamente para crear un nuevo objeto de cliente, que ahora irá a MainFunctions.cpp que invocará la función createNewCustomer() cual es el primero.

void createNewCustomer () {
    string name, address;

    cout << "Creating a new customer..." << endl;
    cout << "Enter the customer's name: "; cin.getline(name,256);
    cout << "Enter the customer's address: "; cin.getline(address,256);

    Customer c(name, address, 0);
    CustomerDB::addCustomer(c);

    cout << endl;
}

  • Muestre un ejemplo compilable completo. Si eso es difícil, al menos muestre la función desde la cual se llama esta función.

    – Benjamín Lindley

    11 de mayo de 2012 a las 14:48


  • ok, editaré la pregunta para incluir lo que de alguna manera se parece a un seguimiento de pila y una captura de pantalla del ejemplo

    -hakuna matata

    11 mayo 2012 a las 14:52

  • dijiste que probaste cin. ignorar. dar el código, debería haber funcionado.

    – J-16 SDIZ

    11 mayo 2012 a las 15:00

entrada de salto de cin y getline duplicate
cris

si estás usando getline después cin >> somethingdebe vaciar la nueva línea del búfer en el medio.

Mi favorito personal para esto si no se necesitan caracteres más allá de la nueva línea es cin.sync(). Sin embargo, está definido por la implementación, por lo que podría no funcionar de la misma manera que para mí. Para algo sólido, use cin.ignore(). O hacer uso de std::ws para eliminar los espacios en blanco iniciales si lo desea:

int a;

cin >> a;
cin.ignore (std::numeric_limits<std::streamsize>::max(), '\n'); 
//discard characters until newline is found

//my method: cin.sync(); //discard unread characters

string s;
getline (cin, s); //newline is gone, so this executes

//other method: getline(cin >> ws, s); //remove all leading whitespace

  • sync() no está definido para hacer eso, aunque puede funcionar en algunos casos. No funciona para mí.

    – Benjamín Lindley

    11 de mayo de 2012 a las 14:59


  • @aizen92, cada vez que cin >> something, dejará una nueva línea en el búfer. El búfer permanece cuando cambias de función, siempre y cuando sigas usando cin. Si la próxima operación a hacer con cin es getlineleerá esa nueva línea sobrante y parecerá omitir la entrada.

    – chris

    11 de mayo de 2012 a las 15:02


  • Aqui tienes. n3242, último borrador de C++11, §27.9.1.5/19 — “Efectos int sync(): si existe un área de colocación, llama a filebuf::overflow para escribir los caracteres en el archivo. Si existe un área de obtención, el efecto está definido por la implementación”.

    – Benjamín Lindley

    11 mayo 2012 a las 15:12

  • ¿Qué sucede si el usuario escribe más de 80 caracteres en una línea? Preferir: std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

    – Robᵩ

    11 mayo 2012 a las 17:28


  • Gracias, había estado luchando con esto durante bastante tiempo.

    – Saheb

    5 de enero de 2015 a las 6:18

1647545589 221 entrada de salto de cin y getline duplicate
jrok

La estructura de su código de menú es el problema:

cin >> choice;   // new line character is left in the stream

 switch ( ... ) {
     // We enter the handlers, '\n' still in the stream
 }

cin.ignore();   // Put this right after cin >> choice, before you go on
                // getting input with getline.

  • Esto funcionó para mí bastante bien.

    –Patrick Mutwiri

    14 de marzo de 2020 a las 23:09

Aquí el '\n' dejado por cin, está creando problemas.

do {
    system("cls");
    manageCustomerMenu();
    cin >> choice;               #This cin is leaving a trailing \n
    system("cls");

    switch (choice) {
        case '1':
            createNewCustomer();
            break;

Esta \n está siendo consumido por el siguiente getline en createNewCustomer(). Deberías usar getline en su lugar –

do {
    system("cls");
    manageCustomerMenu();
    getline(cin, choice)               
    system("cls");

    switch (choice) {
        case '1':
            createNewCustomer();
            break;

Creo que esto resolvería el problema.

  • Usar getline tendrías que cambiar choice a la cadena, entonces no podría usarse así en el switch: podrías usar choice[0] pero eso ocultaría los errores (por ejemplo, ’11’ se trataría como 1, pero ese también es el caso del error aceptado que ignora el resto de la línea.

    – Tony Delroy

    15 de septiembre de 2015 a las 2:50

Me enfrenté a este problema y lo resolví usando getchar() para capturar el nuevo carácter (‘\n’)

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad