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
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.

20 thoughts on “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. 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. encontrastes la solucion?… lo mismo me paso usando POO… pero no descubri cual era el error para que no se lo saltara.

      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.

  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

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s