Предотвратить переполнение буфера - PullRequest
0 голосов
/ 27 октября 2018

Я хочу предотвратить переполнение буфера, сделав имя файла не более 20 символов. Есть ли лучшая функция, которую я должен использовать? Нравится fgets?

#include <stdio.h>

int main()
{
char filename[20]; //20 character long
printf("Please enter your filename:");
scanf("%s", filename);


return 0;
}

1 Ответ

0 голосов
/ 27 октября 2018

scanf и fgets оба могут использоваться, но один, вероятно, будет проще для вашего приложения.

scanf можно использовать, но проверьте возвращаемое значение.

#include <stdlib.h>
#include <stdio.h>
#include <errno.h>

int main(void) {
    char filename[20];
    while(scanf("%19s", filename) == 1) {
        printf("filename: %s\n", filename);
    }
    if(errno) return perror("filename"), EXIT_FAILURE;
    return EXIT_SUCCESS;
}

Выходы,

12345678901234567890
filename: 1234567890123456789
filename: 0

fgets получает всю строку, не сопоставляя ее с входом.

#include <stdlib.h>
#include <stdio.h>
#include <errno.h>

int main(void) {
    char filename[20];
    while(fgets(filename, sizeof filename, stdin)) {
        printf("filename: %s\n", filename);
    }
    if(errno) return perror("filename"), EXIT_FAILURE;
    return EXIT_SUCCESS;
}

Выходы,

12345678901234567890
filename: 1234567890123456789
filename: 0
[\n]

Обычно тоже- длинные имена файлов либо усечены, либо жалуются, это легко увидеть с помощью fgets, например, Как отбросить оставшуюся часть строки в C .

...