防止缓冲区溢出

时间:2018-10-26 23:45:46

标签: c buffer-overflow

我想通过使文件名长度不超过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 :(得分:0)

scanffgets都可以使用,但是对于您的应用程序可能会更容易。

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,例如How to discard the rest of a line in C来看到。