Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: erest0r en 23 Agosto 2013, 02:10 am



Título: Problema con cin.getline
Publicado por: erest0r en 23 Agosto 2013, 02:10 am
Hola de nuevo, mi nuevo problema es con la funcion que nombre en el titulo, y bueno el codigo es este:

Código:
#include<iostream>

using namespace std;

int main()
{
    char str1[5], str2[5];
    cout << "Introduce una frase: ";
    cin.getline(str1, 5, '\n');
    cout << "Tu frase es: " << str1;
    cout << endl << "Ingrese otra frase: ";
    cin.getline(str2, 5, '\n');
    cout << endl << "Tu frase es: " << str2 << endl;
    cin.get();
}


Como podran ver, el programa funcionara mal si el usuario introduce una cadena mayor a 4, y queria saber si me podrian ayudar con una solucion a eso.

Gracias


Título: Re: Problema con cin.getline
Publicado por: flony en 23 Agosto 2013, 05:56 am
cambia el 5
Código:
  cin.getline(str1, 5,'\n');
por el numero que creas conveniente idem
Código:
in.getline(str2, 5, '\n');
lo mismo en el vector
Código:
char str1[5], str2[5];
=====
una opcion es usar string que son por decirlo asi vectores dinamicos donde la longitud la pone el usuario
no lo probe pero deberia ser mas o menos
Código:
#include<iostrem>
#35include<string>[

using manespace std,
int main()
{
string frase;
getline(cin, frase );
cout<<"la frase es " <<frase<<endl;
return 0;
}



Título: Re: Problema con cin.getline
Publicado por: erest0r en 23 Agosto 2013, 06:12 am
La primera solucion que propones no la veo muy satisfactoria, es facil agregar

Código:
cin.getline(str1, 1000000000000,'\n');

pero se ve "anti-programador" tener eso asi xD.
Me gustaria una especie de codigo que pueda manejar ese exceso de la cadena.

Probare la segunda solucion.



Título: Re: Problema con cin.getline
Publicado por: flony en 23 Agosto 2013, 06:19 am
la primer solucion es si queres un limite de palabras...ejemplo la contraseña es de 8 digitos
la segunda es si queres que el usuario escriba hasta cansarse  :laugh:


Título: Re: Problema con cin.getline
Publicado por: erest0r en 23 Agosto 2013, 06:23 am
Ok, pero la cuestion esta en que si el usuario no hace caso e introduce una cadena mayor al limite que le coloque, cómo haria para manejar esa situacion y no me de error.


Título: Re: Problema con cin.getline
Publicado por: flony en 23 Agosto 2013, 06:29 am
una opción es usa la segunda solución, recorrerla con un while y dentro del while un for  y mandarle un mensaje si se pasa, diciendo jodete el exceso de palabras no vale....o mejor para no ofenderlo decirle...che son 8 dígitos nada mas


Título: Re: Problema con cin.getline
Publicado por: erest0r en 23 Agosto 2013, 06:50 am
Yo entiendo, aunque si tuvieses una forma de manejar la primera situacion me gustaria saber, como el gets(), que cuando le pasas por parametro el tamaño de la cadena y el usuario escribe de mas, la funcion solamente tomara hasta el maximo que le indicaste, aunque en este caso creo q hace lo mismo y cuando va al segundo cin.getline(), lo omite, y tampoco puedo hacer algo del tipo 

Código:
 while(getchar() != '\n');

antes del segundo cin.getline(), por eso quisiera saber una forma de poder solucionarlo de la forma en que lo presente, y sino, bueno tendre que hacerlo de la forma en que dijiste.


Título: Re: Problema con cin.getline
Publicado por: rir3760 en 23 Agosto 2013, 17:58 pm
Como ya te comentaron lo mejor es utilizar instancias de la clase string, con ellas los pasos son:
1) Lees la linea completa mediante string::getline.
2) Verificas su tamaño (función miembro size) y si es mayor que el permitido descartas el exceso mediante la función string::erase (http://www.cplusplus.com/reference/string/string/erase/).
Por ejemplo:
Código
  1. string primera;
  2. getline(cin, primera);
  3. if (primera.size() > max_chars) // max_chars == maximo numero de caracteres
  4.   primera.erase(max_chars, string::npos);

Si por alguna razón debes utilizar arrays de caracteres para almacenar las lineas los pasos son:
1) Lees la linea mediante la función istream::get (http://www.cplusplus.com/reference/istream/istream/get/), su funcionamiento es idéntico a istream::getline pero con la diferencia que el carácter delimitador ('\n' a menos que se especifique otro) se queda en el bufer de la entrada estándar.
2) Descartas el resto de la linea (por lo menos el '\n') mediante la función istream::ignore (http://www.cplusplus.com/reference/istream/istream/ignore/?kw=istream%3A%3Aignore).
Por ejemplo:
Código
  1. const int max_chars = 5; // 4 caracteres mas el '\0'
  2.  
  3. // ...
  4.  
  5. char primera[max_chars];
  6. cin.get(primera, max_chars);
  7. cin.ignore(numeric_limits<int>::max(), '\n');

Un saludo


Título: Re: Problema con cin.getline
Publicado por: erest0r en 24 Agosto 2013, 03:33 am
Muchas gracias, todas las soluciones fueron utiles, y la ultima del compañero rir3760 se acerca mas a lo que buscaba.

+1