elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Problema con cin.getline
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problema con cin.getline  (Leído 5,381 veces)
erest0r

Desconectado Desconectado

Mensajes: 147



Ver Perfil
Problema con cin.getline
« 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


En línea

Cruzar la calle junto a mucha gente cuando el semáforo sigue en rojo da seguridad y espíritu de equipo... o cruzamos todos o morimos juntos.
flony


Desconectado Desconectado

Mensajes: 570



Ver Perfil
Re: Problema con cin.getline
« Respuesta #1 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;
}



« Última modificación: 23 Agosto 2013, 06:06 am por flony » En línea

si un problema no tiene solucion entonces no es un problema...es algo inevitable
erest0r

Desconectado Desconectado

Mensajes: 147



Ver Perfil
Re: Problema con cin.getline
« Respuesta #2 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.

En línea

Cruzar la calle junto a mucha gente cuando el semáforo sigue en rojo da seguridad y espíritu de equipo... o cruzamos todos o morimos juntos.
flony


Desconectado Desconectado

Mensajes: 570



Ver Perfil
Re: Problema con cin.getline
« Respuesta #3 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:
En línea

si un problema no tiene solucion entonces no es un problema...es algo inevitable
erest0r

Desconectado Desconectado

Mensajes: 147



Ver Perfil
Re: Problema con cin.getline
« Respuesta #4 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.
En línea

Cruzar la calle junto a mucha gente cuando el semáforo sigue en rojo da seguridad y espíritu de equipo... o cruzamos todos o morimos juntos.
flony


Desconectado Desconectado

Mensajes: 570



Ver Perfil
Re: Problema con cin.getline
« Respuesta #5 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
En línea

si un problema no tiene solucion entonces no es un problema...es algo inevitable
erest0r

Desconectado Desconectado

Mensajes: 147



Ver Perfil
Re: Problema con cin.getline
« Respuesta #6 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.
En línea

Cruzar la calle junto a mucha gente cuando el semáforo sigue en rojo da seguridad y espíritu de equipo... o cruzamos todos o morimos juntos.
rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Problema con cin.getline
« Respuesta #7 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.
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, 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.
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
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
erest0r

Desconectado Desconectado

Mensajes: 147



Ver Perfil
Re: Problema con cin.getline
« Respuesta #8 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
En línea

Cruzar la calle junto a mucha gente cuando el semáforo sigue en rojo da seguridad y espíritu de equipo... o cruzamos todos o morimos juntos.
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
PROBLEMA con la funcion miembro getline() e ignore()
Programación C/C++
.:BlackCoder:. 9 6,575 Último mensaje 27 Julio 2010, 04:29 am
por leogtz
getline()
Programación C/C++
Geek7 3 10,602 Último mensaje 29 Julio 2010, 20:52 pm
por Geek7
cin.getline problemas en C++
Programación C/C++
vikour92 0 1,336 Último mensaje 23 Mayo 2012, 19:24 pm
por vikour92
cin.getline y cin.ignore
Programación C/C++
ricardo2013 6 3,643 Último mensaje 25 Octubre 2012, 17:01 pm
por rir3760
Ayuda! Por favor. Tengo problema con memoria dinámica en c++ y función getline
Programación C/C++
DeathStar92 0 1,346 Último mensaje 25 Noviembre 2012, 19:56 pm
por DeathStar92
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines