char *
fgets ( char * str, int num, FILE * stream );
is safe to
use because it avoid buffer overflow
problem, it scans only num-1
number of char.
Читає символи з потоку та зберігає їх як рядок C в стрі, доки не
буде прочитано символи (num-1) або досягатиметься новий рядок або
кінець файлу, залежно від того, що станеться спочатку.
тут другий аргумент num
- це максимальна кількість
символів, які потрібно скопіювати в str (включаючи кінцевий
нуль-символ).
Наприклад, припустімо, у вашому коді ємність рядка масивів - це
лише символи 5
довгі, як показано нижче.
char str[5];
fgets (str, 5, fp); //5 =you have provision to avoid buffer overrun
Використовуючи наведені вище коди, якщо введення з
fp
перевищує символи 4
,
fgets()
прочитає лише перший 4
Чарли
потім додають \ 0
( і відкидають інші додаткові
символи введення, просто зберігає п'ять символів у str
[]
).
У той час як scanf ("% [^ \ n]", str);
буде
прочитати, поки \ n
не знайдено, а якщо довжина вводу
довша, то 4
chars scanf()
призведе до
переповнення
буферу (як scanf
спробує отримати доступ до
пам'яті за межами максимального індексу 4
в str
[]
).