fscanf () без ограничений ширины поля может обработать sh с огромными входными данными в C - PullRequest
1 голос
/ 30 апреля 2020

У меня есть упражнение в C. Я написал функцию

int readArray(FILE *wp, char *name, int n, double M[n][n])
{
    fscanf(wp, "%s", &name[0]);
    for (int i = 0; i < n; ++i)
        for (int j = 0; j < n; ++j)
            fscanf(wp, "%lf", &M[i][j]);
    return 1;
}

Как я могу это изменить? У меня есть следующее предупреждение

warning: fscanf() without field width limits can crash with huge input data. [invalidscanf]
    fscanf(wp, "%s", &name[0]);

Ответы [ 3 ]

2 голосов
/ 30 апреля 2020

Это не ошибка. Это предупреждение.

И вы решаете его, просто добавляя ограничение к ширине поля, например:

fscanf(wp, "%1234s", &name[0])

Значение 1234 только что составлено. Код выше будет читать не более 1234 байтов.

2 голосов
/ 30 апреля 2020

Сообщение предупреждает вас о том, что fscanf не контролирует размер ввода, что позволяет записывать данные сверх целевого размера буфера. Чтобы решить эту проблему, просто примените длину к %s формату:

char name[50];

fscanf(wp, "%49s", &name[0]);

. Это гарантирует, что в массив имен будет записано не более 49 символов (размер которых в моем примере равен 50. Один символ должен быть оставленным до конца строки).

2 голосов
/ 30 апреля 2020

Заполнитель %s используется для чтения слова в строку.

По умолчанию длина этого слова не ограничена. Спецификатор ширины поля может использоваться вместе с заполнителем% s, чтобы ограничить число байтов, которые будут записаны в буфер.

Поэтому вы должны сделать что-то вроде:

char name[100];
fscanf(wp, "%99s", name);

Для Например, если длина name, полученная из файла, превышает 100, эта функция будет переполнена. Проблема похожа на scanf также.

...