我想通过使文件名长度不超过20个字符来防止缓冲区溢出。我应该使用更好的功能吗?喜欢fgets?
#include <stdio.h>
int main()
{
char filename[20]; //20 character long
printf("Please enter your filename:");
scanf("%s", filename);
return 0;
}
答案 0 :(得分:0)
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
,例如How to discard the rest of a line in C来看到。