Especificando o comprimento máximo da string a digitalizar dinamicamente em C (como "% * s" em printf)

Posso especificar a quantidade máxima de caracteres parascanf ler para umbuffer usando esta técnica:

char buffer[64];

/* Read one line of text to buffer. */
scanf("%63[^\n]", buffer);

Mas e se não soubermos o tamanho do buffer quando escrevermos o código? E se for o parâmetro de uma função?

void function(FILE *file, size_t n, char buffer[n])
{
    /* ... */
    fscanf(file, "%[^\n]", buffer); /* WHAT NOW? */
}

Este código évulnerável a estouros de buffer Comofscanf não sabe o tamanho do buffer.

Lembro-me de ter visto isso antes e comecei a pensar que era a solução para o problema:

fscanf(file, "%*[^\n]", n, buffer);

Meu primeiro pensamento foi que o* no"%*[*^\n]" significava que o tamanho máximo da string recebe um argumento (neste cason) Este é o significado do* noprintf.

Quando verifiquei a documentação parascanf Eu descobri que isso significa quescanf deve descartar o resultado de[^\n].

Isso me deixou um pouco desapontado, pois acho que seria um recurso muito útil poder passar dinamicamente o tamanho do buffer parascanf.

Existe alguma maneira de passar o tamanho do buffer parascanf dinamicamente?

questionAnswers(3)

yourAnswerToTheQuestion