Como usar cin.getline en C++

Bueno, siguiendo con la línea de los posts sobre la librería string.h les traigo esta función que no está en esa librería pero que es muy útil al trabajar con strings. Ya dijimos que un/una string es una variable que puede contener 0, uno o más caracteres.

Ya vimos en nuestra introducción a string.h cómo declarar un string, hacerle algunas modificaciones y cómo mostrarlo. Ahora veremos como pedir un string (que el usuario la introduzca por medio del teclado).

Esto es muy sencillo si usamos la función cin.getline(); Esta función necesita tres datos o parámetros:

  1. Nombre. El nombre de la variable que va a contener el string
  2. Longitud. La cantidad de caracteres que queremos que se puedan introducir (nunca mayor que la longitud del string).
  3. Caracter de fin. El caracter que el usuario va usar como final de la cadena. Por lo general es el ‘enter‘ que se representa como ‘\n’ (diagonal n).

Por ejemplo, supongamos que tenemos un arreglo char de 500 elementos llamado str (nuestra string) y queremos pedirle al usuario que la «llene», la función cin.getline quedaría así:

cin.getline(str, 500, '\n');

Como ven, los parámetros van separados por comas (,), y el caracter de fin está entre comillas simples (‘). Pero bueno, dejemos de suponer y empecemos a programar.

#include<iostream>
using namespace std;

int main()
{
char str[500];
cout << "Introduce una frase: ";
cin.getline(str, 500, '\n');
cout << "Tu frase es: " << str;
cin.get();
}

Mas sencillo no podría ser.

25 comentarios en «Como usar cin.getline en C++»

  1. QUE ES LO QUE HACE LA LINEA 8?, LA FUNCION CIN.GETLINE UTILIZA ENTONCES UNA CADENA DE CARACTERES?

    1: #include
    2: #include
    3: using namespace std;
    4: int main()
    5: {
    6: char frase[11];
    7: cin.getline(frase,11,’n’);
    8: int a=strlen(frase);
    9: for (a;a>0;a–)
    10: cout <<frase[a-1];
    11: system ("PAUSE");
    12: return 0;
    13: }

    1. Sí, que función cin.getline() es para leer una cadena (string) desde el teclado. Y la linea 8, declara una variable entera a y la iguala al tamaño de la cadena ‘frase’. La función strlen() viene de string lenght y nos devuelve el tamaño de una cadena.

    2. Buenas jeje tengo una consulta… es decir en mi proyecto debo hacer un juego estilo preguntados… y debo guardar cada objeto en un txt usando la libreria fstream… la cuestion es que necesito guardar una linea de caracteres y lo estoy haciendo asi… donde io tiene 2 atributos:
      ifstream in;
      ofstream out;

      el metodo recibe un objeto de tipo respuesta (la clase respuesta tiene un string que seria la descripcion de la respuesta o nombre y un bool para identificar cual respuesta es correcta.
      uso un * de bandera para que a la hora de leer el string se detenga al leer el * y guarde todo lo leido hasta antes de llegar ahi
      void IO::WR(Respuesta*p)
      {
      string nomb;
      out.open(«RESP.txt»);
      getline( cin,nomb,’\n’);
      out << nomb <<'*'<<" "<getEsCorrecta()<>getline(cin,nombre,’*’)>>esCorrecta (para el booleano);

      tambien he intententado

      getline (in,nombre,’n’);

      o solo usando

      getline (in, nombre);

      pero no me funciona y no se como hacerlo pq intente hacerlo asi

      getline(in>>nombre,’n’);

      realmente no se como hacer para sacar el archivo usando el ifstream

  2. basura tenemos que empezar a razonar mis amigos cin.get() solo se va a usar para no poner getch(); porfavor no me hagan reir jajaja:)

  3. hola, oye estaba intentando usar esta ‘funcion’ (o como es q se le llama correctamente??) dentro de un metodo en una clase(para POO) y lo que hace es que se lo salta, mi pregunta es si es la misma implementacion para una clase que para el main??

    mi codigo va asi:

    #include
    #include
    #include «Usuario.h»

    class Usuario{
    private:
    int idUsuario;
    int edad;
    char nombre[15];
    string alias;
    string password;
    public:
    bool Usuario::RegistrarUsuario()
    {
    bool devuelto;
    int i=0;
    cout << "Dame los datosn";
    cout <nombre,15,’n’);// ESTO SE LO SALTA
    A LA HORA DE EJECUTARSE
    this->nombre[15]=nombre[15];
    cout <> this->alias;
    cout <> this->password;
    cout <> this->edad;
    cout << "tSu numero de usuario es " << i <idUsuario=i;
    i++;
    if (alias!= «» && password != «»)
    devuelto= true;
    else
    devuelto= false;
    return devuelto;
    }
    }
    y esque lo que quiero esq lea un nombre completo, ejemplo «Alan Gil» porque ya intente varias maneras pero no sale, porfa ayuda, solo quiero saber como se implementaria en una clase. Gracias

      1. Respuesta a kevin: lo siento andaba en bandeja de spam, pero ya respondo.
        Lo que hice fue usar doble vez el ‘cin.getline’ y con eso ya jalaba, no entiendo pro que pero usandolo dos veces ya lo reconocia!!! 😀

  4. Quizás esto ayude. Por lo general cuando utilizan una función del tipo «getxxxx» que toma caracteres, string, o línea del buffer, es recomendable limpiar el buffer antes, para quitar residuos de otras funciones que se hayan utilizado antes. Ello podrá realizarse con cin.sync(). Espero sirva para los que tenían inconvenientes.

  5. Disculpen respecto de lo anterior. cin.sync(), no limpia el buffer, sólo lo sincroniza luego de cualquier cin.xxxx(). Por ende, va despues de utilizar cualquier cin.xxxx().

  6. Aquí tiene un ejemplo usando cin.getline.
    PERMITIR INGRESO DE SOLO DATOS INT O STRING.

    #include
    #include
    #include
    #include
    #include
    #include

    using namespace std;

    int main()
    {

    string input;
    int myNumber = 0;

    while (true) {
    cout <> myNumber)
    break;
    cout << "Invalid number, please try again" << endl;
    }
    cout << "You entered: " << myNumber << endl << endl;

    cin.get();
    return 0;
    }

  7. Hola. Busqué por todas partes una solución al problema que tenía con mi código y creo que acá he encontrado una solución. Pero a pesar de eso, tengo un inconveniente. Para mayor comprensión voy a dejar el código.

    //—————————————————————————

    #include
    #pragma hdrstop
    #include
    #include
    #include
    #include
    struct prueba{
    char nombre[10][50];
    int tel[10][50];

    }punt;
    using namespace std;
    //—————————————————————————

    #pragma argsused
    int main(int argc, char* argv[])
    {
    cout<<"hola"<<std::endl;
    int cont;
    cout<>cont;
    for (int i=0;i<cont;i++)
    {
    cout<<"Digite el nombre: ";
    cin.getline(punt.nombre[i], 50);
    //std::cout<>punt.tel[i-1];
    }

    // for (int i=1;i<=cont;i++)
    // {
    // std::cout<<"Nombre "<<i<<": "<<punt.nombre[i-1]<<std::endl;
    //std::cout<<"Telefono "<<i<<": "<<punt.tel[i-1])<<std::endl;

    //}

    return 0;
    getch();
    }
    std::cout<<"hola"<<std::endl;
    int cont;
    std::cout<<"Digite el numero de estudiantes: "<>cont;
    for (int i=1;i<=cont;i++)
    {
    std::cout<<"Digite su nombre: ";
    std::cin.getline(punt.nombre[i-1], 50);
    std::cout<>punt.tel[i-1];
    }

    for (int i=1;i<=cont;i++)
    {
    std::cout<<"Nombre "<<i<<": "<<punt.nombre[i-1]<<std::endl;
    //std::cout<<"Telefono "<<i<<": "<<punt.tel[i-1])<<std::endl;

    }

    system("PAUSE");
    return EXIT_SUCCESS;
    }

    Al utilizar cin.getline en el primer for, muestra en la consola Digite su nombre: Digite su nombre , seguidos y se come ya dos conteos sin ni si quiera recibir el primer dato. Es decir, está almacenando 9 datos y no 10 como yo quiero. Otra cosa, con los enteros también puedo utilizar cin.getline o solo es para cadenas? Si no es así, entonces como hago para almacenar los número telefónicos en el array de strings que declaré en la estructura? Estaría muy agradecido por las respuestas.

    1. Tienes que cambiar esos valores:

      //for(int i=0;i<cont;i++)
      for (int i=1;i<=cont;i++)
      {
      std::cout<<"Nombre "<<i<<": "
      // a esa <<i<< debes sumarle un 1 (<<i+1<<) si quieres que el iterador comience desde el uno. Cuando i<= a la cantidad de iteraciones te suma uno. Por eso si pones uno te mostrara 2, si pones 3 pues te mostrara 4…

      Espero que te sirva.

  8. Hola:

    Yo tengo un pequeño inconveniente con getline y es que cuando lo uso sin más me funciona perfectamente, pero cuando le pongo por ejemplo que quiero que me introduzca un número antes y otro después, es decir algo como:

    cin>>num1;
    getline (cin, variable);
    cin>>num2;

    Solo me permite introducir el primer número y la variable string, luego el programa termina su ejecución, además de que si imprimo el resultado lo que sale en «variable» es un conjunto de números, como si no pudiera leer el alfabeto. ¿Qué podría ser? :S

  9. Hola, tengo un problema con esta estructura
    cout<<"Ingrese nombre de el estudiante "<<n<>nombre;
    cin.getline(nombre, 500, ‘n’);
    El problema es que al ejecutar el programa muestra lo que escribí pero después del espacio por ejemplo si escribo pepito perez solo me muestra perez

Deja un comentario