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?

Respuestas a la pregunta(3)

Su respuesta a la pregunta