考虑下面的程序。
C
void read()
{
char str[20];
gets(str);
printf("%s", str);
return;
}
C
#define MAX_LIMIT 20
void read()
{
char str[MAX_LIMIT];
fgets(str, MAX_LIMIT, stdin);
printf("%s", str);
getchar();
return;
}
C
int len = strlen(str);
// Remove the '\n' character and replace it with '\0'
str[len - 1] = '\0';
该代码看起来很简单,它从标准输入中读取字符串并打印输入的字符串,但是由于get()没有进行任何数组绑定测试,因此它遭受了缓冲区溢出的困扰。得到()不断阅读,直到它看到一个字符。
为避免缓冲区溢出,应使用fgets()代替gets(),因为fgets()确保读取的字符不能超过MAX_LIMIT个。
C
#define MAX_LIMIT 20
void read()
{
char str[MAX_LIMIT];
fgets(str, MAX_LIMIT, stdin);
printf("%s", str);
getchar();
return;
}
注意: fgets()如果读取了’\ n’字符,则该字符必须由程序员明确地删除。正是因此,通常建议您STR可以存储至少(MAX_LIMIT + 1)的字符,如果你的目的是要保持字符。这样做是为了在字符串末尾有足够的空间添加空终止字符’\ 0’。
如果保持字符无意,那么可以简单地作出以下
C
int len = strlen(str);
// Remove the '\n' character and replace it with '\0'
str[len - 1] = '\0';
请随时在此处阅读有关gets()和fgets()的更多信息。
想要从精选的最佳视频中学习和练习问题,请查看《基础知识到高级C的C基础课程》。