Указание максимальной длины строки для динамического сканирования в C (например, «% * s» в printf)
Я могу указать максимальное количество символов дляscanf
читать наbuffer
используя эту технику:
char buffer[64];
/* Read one line of text to buffer. */
scanf("%63[^\n]", buffer);
Но что, если мы не знаем длину буфера, когда пишем код? Что если это параметр функции?
void function(FILE *file, size_t n, char buffer[n])
{
/* ... */
fscanf(file, "%[^\n]", buffer); /* WHAT NOW? */
}
Этот кодуязвимы для переполнения буфера какfscanf
не знает, насколько большой буфер.
Я помню, как видел это раньше и начал думать, что это было решение проблемы:
fscanf(file, "%*[^\n]", n, buffer);
Моей первой мыслью было то, что*
в"%*[*^\n]"
означало, что максимальному размеру строки передается аргумент (в данном случаеn
). Это значение*
вprintf
.
Когда я проверил документацию дляscanf
Я узнал, что это означает, чтоscanf
следует отказаться от результата[^\n]
.
Это несколько разочаровало меня, так как я думаю, что было бы очень полезно иметь возможность динамически передавать размер буфера дляscanf
.
Есть ли способ передать размер буфера вscanf
динамически?