Data entry via std :: getline does not wait for the user to enter the string

2

I try to make a program in C ++ to store, search and replace student data, but in the case 3 (to replace data) I have problems with data entry type string.

Since in the part where the user must enter the data that will replace the old name or last name, the program does not wait for data entry :

cout << "Dame el nombre" << endl;
getline(cin,nombre);
cout << "Dame el apellido" << endl;
getline(cin,apellido);

Here the complete code:

#include <iostream>

using namespace std;

typedef struct
{
    string nombre;
    string apellido;
    int edad;
    float estatura;
    bool activo;
}Datos;



int main()
{
    int noAlumnos=2;
    Datos Alumnos[noAlumnos];
    string nombrex,aux,apellidox,aix;
    int aox,edadx;
    float apx,estaturax;
    bool activox,aax;
    int opc,td;
    bool arregloLleno=false;
    do{
    cout << " MENU " << endl;
    cout << "0 Salir" << endl;
    cout << "1 Llenar arreglo" << endl;
    cout << "2 Buscar elemento por posicion" << endl;
    cout << "3 Reemplazar elemento por posicion" << endl;
    cout << "Elije una opcion: ";
    cin >> opc;
    cin.get();
    switch(opc)
    {
 case 0:
        break;
 case 1:
        if(arregloLleno==false)
            {
                int i,edad;
                float estatura;
                char activo;
                string nombre;
                string apellido;
                for(i=0;i<noAlumnos;i++)
                    {
                        cout << "Datos del alumno " << i+1 << endl;
                        cout << "Dame el nombre" << endl;
                        getline(cin,nombre);
                        cout << "Dame el apellido" << endl;
                        getline(cin,apellido);
                        cout << "Dame la edad" << endl;
                        cin >> edad;
                        cout << "Dame la estatura" << endl;
                        cin >> estatura;
                        cin.get();
                        cout << "El alumno esta activo? (S/N)" << endl;
                        cin >> activo;
                        if((activo=='s')||(activo=='S'))
                            {
                                Alumnos[i].activo=true;
                            }
                        else
                            {
                                Alumnos[i].activo=false;
                            }
                        cin.get();
                        Alumnos[i].nombre = nombre;
                        Alumnos[i].apellido = apellido;
                        Alumnos[i].edad = edad;
                        Alumnos[i].estatura = estatura;
                    }
            arregloLleno=true;
            }
        else
            {
                cout << "Al arreglo ya se han asignado valores" << endl;
            }
        break;
case 2:
    if(arregloLleno)
        {
            int posicion=0;
            cout << "Dame la posicion del arreglo a buscar: " << endl;
            cin >> posicion;
            if(posicion>0 && posicion<=noAlumnos)
                {
                    cout << "En la posicion del arreglo " << posicion << " se encuentra los datos: " << endl;
                    cout << "Datos del alumno " << posicion << endl;
                    posicion--;
                    cout << "Nombre: " <<  Alumnos[posicion].nombre << endl;
                    cout << "Apellido: " << Alumnos[posicion].apellido << endl;
                    cout << "Edad: " << Alumnos[posicion].edad << endl;
                    cout << "Estatura: " << Alumnos[posicion].estatura << endl;
                    if(Alumnos[posicion].activo)
                        {
                            cout << "El alumno se encuentra activo" << endl;
                        }
                    else
                        {
                            cout << "El alumno no encuentra activo" << endl;
                        }
                    cout << endl;
                }
            else
                {
                    cout << "Posicion inexistente" << endl;
                }
            cin.get();
        }
        else
            {
                cout << "El arreglo no contiene valores" << endl;
            }
    break;
case 3:
    if(arregloLleno)
        {
            int posicion=0;
            cout << "Dame la posicion del arreglo a buscar: " << endl;
            cin >> posicion;
            if(posicion>0 && posicion<=noAlumnos)
                {
                    cout << "En la posicion del arreglo " << posicion << " se encuentra los datos: " << endl;
                    cout << "Datos del alumno " << posicion << endl;
                    posicion--;
                    cout << "Nombre: " <<  Alumnos[posicion].nombre << endl;
                    cout << "Apellido: " << Alumnos[posicion].apellido << endl;
                    cout << "Edad: " << Alumnos[posicion].edad << endl;
                    cout << "Estatura: " << Alumnos[posicion].estatura << endl;
                    if(Alumnos[posicion].activo)
                        {
                            cout << "El alumno se encuentra activo" << endl;
                        }
                    else
                        {
                            cout << "El alumno no encuentra activo" << endl;
                        }
                    cout << endl;
                    float estatura;
                    char activo;
                    string nombre,apellido;
                    int opcx, edad;
                    cout << "Alumno: " << posicion+1 << endl;
                    cout << "Que valor(es) deseas modificar?" << endl;
                    cout << "1 Modificar todos los elementos " << endl;
                    cout << "2 Modificar el nombre " << endl;
                    cout << "3 Modificar el apellido" << endl;
                    cout << "4 Modificar la edad " << endl;
                    cout << "5 Modificar la estatura " << endl;
                    cout << "6 Modificar el status " << endl;
                    cin >> opcx;
                    switch(opcx)
                    {
                    case 1:
                        cout << "Dame el nombre" << endl;
                        getline(cin,nombre);
                        cout << "Dame el apellido" << endl;
                        getline(cin,apellido);
                        cout << "Dame la edad" << endl;
                        cin >> edad;
                        cout << "Dame la estatura" << endl;
                        cin >> estatura;
                        cin.get();
                        cout << "El alumno esta activo? (S/N)" << endl;
                        cin >> activo;
                        if((activo=='s')||(activo=='S'))
                            {
                                Alumnos[posicion].activo=true;
                            }
                        else
                            {
                                Alumnos[posicion].activo=false;
                            }
                        cin.get();
                        Alumnos[posicion].nombre = nombre;
                        Alumnos[posicion].apellido = apellido;
                        Alumnos[posicion].edad = edad;
                        Alumnos[posicion].estatura = estatura;
                        cout << "Ahora los datos son " << endl;
                        cout << "Datos del alumno " << posicion << endl;
                        cout << "Nombre: " <<  Alumnos[posicion].nombre << endl;
                        cout << "Apellido: " << Alumnos[posicion].apellido << endl;
                        cout << "Edad: " << Alumnos[posicion].edad << endl;
                        cout << "Estatura: " << Alumnos[posicion].estatura << endl;
                        if(Alumnos[posicion].activo)
                            {
                                cout << "El alumno se encuentra activo" << endl;
                            }
                        else
                            {
                                cout << "El alumno no encuentra activo" << endl;
                            }
                        cout << endl;
                    break;
                    case 2:
                        cout << "Dame el nombre " << endl;
                        getline(cin,nombre);
                        Alumnos[posicion].nombre = nombre;
                        cout << "Ahora los datos son " << endl;
                        cout << "Datos del alumno " << posicion << endl;
                        cout << "Nombre: " <<  Alumnos[posicion].nombre << endl;
                        cout << "Apellido: " << Alumnos[posicion].apellido << endl;
                        cout << "Edad: " << Alumnos[posicion].edad << endl;
                        cout << "Estatura: " << Alumnos[posicion].estatura << endl;
                        if(Alumnos[posicion].activo)
                            {
                                cout << "El alumno se encuentra activo " << endl;
                            }
                        else
                            {
                                cout << "El alumno no encuentra activo " << endl;
                            }
                        cout << endl;
                    break;
                    case 3:
                        cout << "Dame el apellido " << endl;
                        getline(cin,apellido);
                        Alumnos[posicion].apellido = apellido;
                        cout << "Ahora los datos son " << endl;
                        cout << "Datos del alumno " << posicion << endl;
                        cout << "Nombre: " <<  Alumnos[posicion].nombre << endl;
                        cout << "Apellido: " << Alumnos[posicion].apellido << endl;
                        cout << "Edad: " << Alumnos[posicion].edad << endl;
                        cout << "Estatura: " << Alumnos[posicion].estatura << endl;
                        if(Alumnos[posicion].activo)
                            {
                                cout << "El alumno se encuentra activo" << endl;
                            }
                        else
                            {
                                cout << "El alumno no encuentra activo" << endl;
                            }
                        cout << endl;
                    break;
                    case 4:
                        cout << "Dame la edad" << endl;
                        cin >> edad;
                        cin.get();
                        Alumnos[posicion].edad = edad;
                        cout << "Ahora los datos son" << endl;
                        cout << "Datos del alumno " << posicion << endl;
                        cout << "Nombre: " <<  Alumnos[posicion].nombre << endl;
                        cout << "Apellido: " << Alumnos[posicion].apellido << endl;
                        cout << "Edad: " << Alumnos[posicion].edad << endl;
                        cout << "Estatura: " << Alumnos[posicion].estatura << endl;
                        if(Alumnos[posicion].activo)
                            {
                                cout << "El alumno se encuentra activo" << endl;
                            }
                        else
                            {
                                cout << "El alumno no encuentra activo" << endl;
                            }
                        cout << endl;
                    break;
                    case 5:
                        cout << "Dame la estatura" << endl;
                        cin >> estatura;
                        cin.get();
                        Alumnos[posicion].estatura = estatura;
                        cout << "Ahora los datos son" << endl;
                        cout << "Datos del alumno " << posicion << endl;
                        cout << "Nombre: " <<  Alumnos[posicion].nombre << endl;
                        cout << "Apellido: " << Alumnos[posicion].apellido << endl;
                        cout << "Edad: " << Alumnos[posicion].edad << endl;
                        cout << "Estatura: " << Alumnos[posicion].estatura << endl;
                        if(Alumnos[posicion].activo)
                            {
                                cout << "El alumno se encuentra activo" << endl;
                            }
                        else
                            {
                                cout << "El alumno no encuentra activo" << endl;
                            }
                        cout << endl;
                    break;
                    case 6:
                        cout << "El alumno esta activo? (S/N)" << endl;
                        cin >> activo;
                        if((activo=='s')||(activo=='S'))
                            {
                                Alumnos[posicion].activo=true;
                            }
                        else
                            {
                                Alumnos[posicion].activo=false;
                            }
                        cout << "Ahora los datos son" << endl;
                        cout << "Datos del alumno " << posicion << endl;
                        cout << "Nombre: " <<  Alumnos[posicion].nombre << endl;
                        cout << "Apellido: " << Alumnos[posicion].apellido << endl;
                        cout << "Edad: " << Alumnos[posicion].edad << endl;
                        cout << "Estatura: " << Alumnos[posicion].estatura << endl;
                        if(Alumnos[posicion].activo)
                            {
                                cout << "El alumno se encuentra activo" << endl;
                            }
                        else
                            {
                                cout << "El alumno no encuentra activo" << endl;
                            }
                        cout << endl;
                    cin.get();
                    break;
                    default:
                        cout << "Opcion no valida" << endl;
                        break;
                    }
                }
                else
                    {
                        cout << "Posicion inexistente" << endl;
                    }
                cin.get();
        }
        else
            {
                cout << "El arreglo no contiene valores" << endl;
            }
break;

}
}while(opc!=0);
}

I would like to know the cause of this problem and how to solve it, any other recommendation other than my question is welcome. In advance, thank you.

    
asked by dannaobelana 26.11.2017 в 04:17
source

1 answer

1

The error occurs when you read before with cin>>variable

How to fix it?

setting cin.ignore(); before reading with getline , your code would be:

cin.ignore(); //despues de leer con cualquier cin>>

cout << "Dame el nombre" << endl;
getline(cin,nombre);
cout << "Dame el apellido" << endl;
getline(cin,apellido);
    
answered by 26.11.2017 / 05:30
source