quimica language iec book acorde c c11

language - c99 en c



¿Qué es get() equivalente en C11? (4)

Desde cplusplus.com

La revisión más reciente del estándar C (2011) ha eliminado definitivamente esta función de su especificación

La función está en desuso en C ++ (a partir del estándar de 2011, que sigue a C99 + TC3).

Solo quería saber cuál es la alternativa para gets() en el estándar C11.


En C11, gets ha sido sustituido por gets_s que tiene la siguiente declaración:

char *gets_s(char *str, rsize_t n);

Esta función leerá como máximo n-1 caracteres desde stdin hasta *str . Esto es para evitar la vulnerabilidad de desbordamiento de búfer inherente a gets . La función fgets también es una opción. De http://en.cppreference.com/w/c/io/gets :

La función gets () no realiza la verificación de límites, por lo que esta función es extremadamente vulnerable a los ataques de desbordamiento de búfer. No se puede usar de forma segura (a menos que el programa se ejecute en un entorno que restrinja lo que puede aparecer en la entrada estándar). Por esta razón, la función ha quedado en desuso en la tercera corrección al estándar C99 y se eliminó por completo en el estándar C11. fgets () y gets_s () son los reemplazos recomendados.

Nunca use gets () .

Dado que gets_s está definido en una extensión del estándar, solo se implementa opcionalmente, probablemente debería escribir sus programas usando fgets lugar. Si usa fgets en stdin su programa también compilará en versiones anteriores de C. Pero tenga en cuenta la diferencia en el comportamiento: cuando gets_s ha leído n-1 caracteres , continúa leyendo hasta que se alcanza una nueva línea o fin de archivo. , descartando la entrada. Por lo tanto, con gets_s siempre está leyendo una línea completa, incluso si solo una parte de ella puede devolverse en el búfer de entrada.


Otros ya han respondido la pregunta. En aras de la integridad, esta es la recomendación del estándar C:

ISO9899: 2011 K.3.5.4.1 / 6

Práctica recomendada

La función fgets permite que los programas escritos correctamente procesen con seguridad las líneas de entrada durante demasiado tiempo para almacenarlas en la matriz de resultados. En general, esto requiere que las personas que llaman a fgets presten atención a la presencia o ausencia de un carácter de nueva línea en la matriz de resultados. Considere usar fgets (junto con cualquier procesamiento necesario basado en caracteres de nueva línea) en lugar de gets_s.

Así que debes usar fgets siempre que sea posible.

EDITAR

El comportamiento de gets_s se especifica para que sea:

ISO9899: 2011 K.3.5.4.1 / 4

Descripción

La función gets_s lee a lo sumo uno menos que el número de caracteres especificados por n en el flujo al que apunta stdin, en la matriz apuntada por s. No se leen caracteres adicionales después de un carácter de nueva línea (que se descarta) o después del final del archivo. El carácter de nueva línea descartado no cuenta para el número de caracteres leídos. Se escribe un carácter nulo inmediatamente después de la última lectura del carácter en la matriz.

Si se encuentra el final del archivo y no se han leído caracteres en la matriz, o si se produce un error de lectura durante la operación, s [0] se establece en el carácter nulo, y los otros elementos de s toman valores no especificados.



Según el man 3 gets , fgets .