Seguimos necesitando fgets por seguridad?

Iniciado por skan, 14 Agosto 2013, 01:33 AM

0 Miembros y 3 Visitantes están viendo este tema.

skan

Hola

Hace un tiempo leí  Effective C++, donde se aconseja el uso de fgets() (y strncat) en vez de get() porque se puede especificar el número de caracteres a leer y así no se produce un desbordamiento de memoria.

Varios libros nuevos, como el de Prata o Professional C++ no hablan de fgets.
¿Se debe a que ya no hace falta?
Lo digo porque comandos como cin.get()  y cin.getline() pueden especificar el tamaño a leer.
¿Qué diferencia hay entre cin.get() y fgets()?

amchacon

En C++ ya no hace falta, menos cuando existe la clase string, cuyo tamaño puede modificarse sobre la marcha:

Código (cpp) [Seleccionar]
string Texto;
getline(cin,Texto); // Puedes leer infinitos caracteres
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

skan

Cita de: amchacon en 14 Agosto 2013, 01:50 AM
En C++ ya no hace falta, menos cuando existe la clase string, cuyo tamaño puede modificarse sobre la marcha:

Código (cpp) [Seleccionar]
string Texto;
getline(cin,Texto); // Puedes leer infinitos caracteres


¿Y qué pasa si cin no cabe en memoria?

amchacon

#3
string es una clase que se ajusta solo, de modo que si metes 100 caracteres se reservaran 100 caracteres.

Dado que cada caracter ocupa 1 byte, es muy díficil que tengas problemas de memoria (cuantos caracteres vas a meter? 1000000000?). Pero si así fuera lanzaría una excepcion (bad_alloc) que podrías manejar con un try y catch (o no la manejas, y entonces el programa finalizaría mostrando un mensaje de error).
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

skan

OK, gracias.  Lo que no entiendo es porque algunas cosas devuelven punteros (como los nombres de los array) y otras no (como los string)

0xDani

Cita de: skan en 14 Agosto 2013, 14:21 PM
OK, gracias.  Lo que no entiendo es porque algunas cosas devuelven punteros (como los nombres de los array) y otras no (como los string)


Por que string es una clase built-in de la STL, que internamente también maneja un array de caracteres. Puedes acceder a ese array por medio de la función c_str() de la clase string.

Saludos.
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM