• Blog
  • Acerca
  • Autor
  • Contacto
  • 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.

    1. CARLA dice:

      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: }

      • THEbatzuk dice:

        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. CARLA dice:

      Gracias te lo agradezco!!

    3. eduardo dice:

      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:)

    4. Sebastian dice:

      Disculpa pero y si tengo que ingresar 5 fraces usando una matriz, como tengo que declararlo?

    5. Jeffer dice:

      como siempre no falta el ignorante (Eduardo)

    6. Pepe dice:

      Excelente andaba buscando algo parecido, muy bueno amigo!!!

    7. Ruku dice:

      cin.getline() es parecido a getchar() verdad?

    8. uriel dice:

      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 datos\n";
      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

      • kevin dice:

        encontrastes la solucion?… lo mismo me paso usando POO… pero no descubri cual era el error para que no se lo saltara.

        • uriel dice:

          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!!! :D

    9. maxi dice:

      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.

    10. maxi dice:

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

    11. 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;
      }

    12. Angie Katerine Borda Rodriguez dice:

      hola muchas gracia por tu blog ha sido de gran ayuda para mi

    13. Reytin dice:

      oigas alguien sabe para k sirve el cin.get();cin.get(); alguien me puede decir

    14. D3nnis dice:

      Me gusto mucho .porque de esa manera puedo dejar espacios en blanco ; si solo uso el cin no me lo permite

    15. Diego dice:

      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.

    16. Sarah dice:

      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

    Hola, escribe aquí tu comentario: