Q:下面的代码有一个被隐藏的问题,你能找到它吗?
#include <stdio.h>
int main(void)
{
char buff[10];
memset(buff, 0, sizeof(buff));
gets(buff);
printf("%s\n", buff);
return 0;
}
A:这个不显眼的问题就是使用了gets()方法,其函数原型如下:
char* gets(char *s);
此方法接受一个字符数组参数,但是却没有检查此数组是否有足够的空间来拷贝数据。gets()函数是不安全的,不推荐使用,一般情况下编译器也会给出警告提示:the `gets' function is dangerous and should not be used。gets()不检查预留存储区是否能够容纳实际输入的数据。多出来的字符简单的溢出到相邻的存储区,可能会导致错误。
所以,这里我们一般用fgets()方法更好,函数原型如下:
char* fgets(char *s, int n, FILE *stream);
一般使用fgets()函数,都是读取文件当中的n-1个字符到s中,其实,此函数还有一个很好的用处就是从标准输入流中读取字符串,而且不用担心输入的字符个数超出了字符数组的大小而导致溢出的问题!要怎样做呢?如下:
char str[10];
fgets(str, siezof(str), stdin);
值得注意的是:谨记fgets()只读取n-1个字符。所以,fgets()读取到换行符、文件尾或读完n-1个字符便会进行返回。