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?