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

Так что в основном я хочу ввести данные таким образом, например, «строка:% d:% d:% d», если я использую «% s:% d:% d:% d», это не может остановить сканирование строки пока он не найдет пробел, но если я использую этот "% [^:]:% d:% d:% d", он работает, но я получаю ошибку, используя cppcheck, которая:

scanf() without field width limits can crash with huge input data. Add a field width specifier to fix this problem.

Sample program that can crash:

#include <stdio.h>
int main()
{
    char c[5];
    scanf("%s", c);
    return 0;
}

Typing in 5 or more characters may make the program crash. The correct usage here is 'scanf("%4s", c);', as the maximum field width does not include the terminating null byte.

I Не понимаю, почему, если кто-то может мне помочь, я буду очень признателен.

1 Ответ

3 голосов
/ 05 апреля 2020

вы можете использовать

    int a, b, d;
    char c[5];
    if (scanf("%4[^:]:%d:%d:%d", c, &a, &b, &d) != 4)
    {
        exit(EXIT_FAILURE);
    }
//for your program example use scanf("%4s",c);

, чтобы избежать переполнения буфера.

для вашей строки, вы можете сканировать 4 символов (+1 для \0), в противном случае вы будет проходить границы вашего массива, и это приведет к неопределенному поведению.

и если вы хотите хранить больше данных, например, хлеб в массиве c, массив должен быть char c[6].

это все о наличии достаточного места, когда вы хотите сохранить данные, и добавление этого числа в scanf, как scanf("%5s",c);, не даст scanf прочитать больше данных, чем у нас есть место.

...