Especificar la longitud máxima de cadena para escanear dinámicamente en C (como "% * s" en printf)
Puedo especificar la cantidad máxima de caracteres parascanf
leer a unbuffer
usando esta técnica:
char buffer[64];
/* Read one line of text to buffer. */
scanf("%63[^\n]", buffer);
Pero, ¿qué pasa si no sabemos la longitud del búfer cuando escribimos el código? ¿Qué pasa si es el parámetro de una función?
void function(FILE *file, size_t n, char buffer[n])
{
/* ... */
fscanf(file, "%[^\n]", buffer); /* WHAT NOW? */
}
Este código esvulnerable a desbordamientos del búfer comofscanf
no sabe qué tan grande es el búfer.
Recuerdo haber visto esto antes y comencé a pensar que era la solución al problema:
fscanf(file, "%*[^\n]", n, buffer);
Mi primer pensamiento fue que el*
en"%*[*^\n]"
significaba que el tamaño máximo de la cadena pasa un argumento (en este cason
) Este es el significado de la*
enprintf
.
Cuando revisé la documentación parascanf
Descubrí que significa quescanf
debe descartar el resultado de[^\n]
.
Esto me dejó un poco decepcionado, ya que creo que sería una característica muy útil poder pasar el tamaño del búfer dinámicamente parascanf
.
¿Hay alguna manera de pasar el tamaño del búfer ascanf
¿dinamicamente?