Comunidad PHPeros

Lenguajes => C / C++ => Mensaje iniciado por: Physlet en 14 de Abril de 2011, 02:19:24 am

Título: Leer cadena cuya longitud desconozco
Publicado por: Physlet en 14 de Abril de 2011, 02:19:24 am
Hola,

Resulta que un amigo me pidió que lo ayudara en una aplicación de consola en C++, pero he estado teniendo muchos problemas con la lectura de cadenas. ¿Cuál es la forma más correcta para hacerlo?
Título: Re:Leer cadena cuya longitud desconozco
Publicado por: CarlosRdrz en 14 de Abril de 2011, 11:11:17 am
En C++ has probado a usar cin con getline??

string cadena;
getline(cin, cadena);

Saludos!
Título: Re:Leer cadena cuya longitud desconozco
Publicado por: Physlet en 14 de Abril de 2011, 15:39:16 pm
En C++ has probado a usar cin con getline??
string cadena;
getline(cin, cadena);
Saludos!
Sí, y recuerdo que tenía un error extraño que iba de la siguiente forma:

- Primera lectura: ASDASDASDASDA
- Segunda lectura:-Tercera lectura: 0312329

O sea, que cuando hacía la primera lectura, y tocaba la segunda, se sobreponía la tercera.
Título: Re:Leer cadena cuya longitud desconozco
Publicado por: CarlosRdrz en 15 de Abril de 2011, 00:48:44 am
Bueno, eso puede depender del código que esté usando, pero mira este ejemplo
http://www.cplusplus.com/reference/iostream/istream/getline/
Título: Re:Leer cadena cuya longitud desconozco
Publicado por: Physlet en 15 de Abril de 2011, 02:13:12 am
Bueno, eso puede depender del código que esté usando, pero mira este ejemplo
http://www.cplusplus.com/reference/iostream/istream/getline/
Pero en esos ejemplos se utilizan arreglos de caracteres, por lo tanto utilizan una cantidad fija de caracteres. ¿No importa si utilizo una cantidad menor a los 256 caracteres?
Título: Re:Leer cadena cuya longitud desconozco
Publicado por: CarlosRdrz en 15 de Abril de 2011, 15:14:12 pm
No, claro que no pasa nada.
Simplemente estarías gastando algunos bytes, pero que son 100 bytes al fin y al cabo? No supone nada malo.
Lo malo sería que gastaras mas bytes de los que tiene tu arreglo, entonces si sería una amenaza, pero getline siempre lee el numero de caracteres que les pases, así que con que te asegures de que coincide con el arreglo que tienes no pasa nada (como en el ejemplo que te pasé).

No te preocupes si te haces el arreglo de 256 y luego solo usas 6, eso pasa muchas veces.
Ahora bien, si puedes evitarlo mejor. Si por ejemplo quieres guardar un nombre (sin apellidos) de una persona es ridículo que reserves 256, puesto que no vas a gastar mas de 15 (o incluso menos).

Saludos
Título: Re:Leer cadena cuya longitud desconozco
Publicado por: Physlet en 16 de Abril de 2011, 00:26:32 am
No, claro que no pasa nada.
Simplemente estarías gastando algunos bytes, pero que son 100 bytes al fin y al cabo? No supone nada malo.
Lo malo sería que gastaras mas bytes de los que tiene tu arreglo, entonces si sería una amenaza, pero getline siempre lee el numero de caracteres que les pases, así que con que te asegures de que coincide con el arreglo que tienes no pasa nada (como en el ejemplo que te pasé).

No te preocupes si te haces el arreglo de 256 y luego solo usas 6, eso pasa muchas veces.
Ahora bien, si puedes evitarlo mejor. Si por ejemplo quieres guardar un nombre (sin apellidos) de una persona es ridículo que reserves 256, puesto que no vas a gastar mas de 15 (o incluso menos).

Saludos
Ah excelente, es que no sabía realmente como trabajaba eso en C++, ya que como el único lenguaje serio con el que he trabajado puramente es Java, ahí no se podría hacer algo como eso porque tiraría muchas excepciones del tipo NullPointerException cuando intenta acceder a espacios no ocupados de un arreglo, aunque claro acá ya existe una clase para tratar las cadenas y tal.

Muchas gracias por la aclaración :)