2

我最近面临一个关于以下代码隐藏问题的面试问题。我无法检测到它。有人可以帮忙吗?

#include<stdio.h>

int main(void)
{
    char buff[10];
    memset(buff,0,sizeof(buff));

    gets(buff);

    printf("\n The buffer entered is [%s]\n",buff);

    return 0;
}
4

5 回答 5

5

该函数从标准输入接收字符串并且不检查缓冲区的容量。这可能导致缓冲区溢出。这里可以使用标准函数fgets() 。

于 2013-05-17T02:57:06.683 回答
2

gets可以返回超过 10 个字符。

get 确实有问题,因为你不能告诉它只填充 'buff' 到 10 的长度。

于 2013-05-17T02:56:05.157 回答
1

检查本手册的错误部分,上面写着

   Never use gets().  Because it is impossible to tell without knowing
   the data in advance how many characters gets() will read, and because
   gets() will continue to store characters past the end of the buffer,
   it is extremely dangerous to use.  It has been used to break computer
   security.  Use fgets() instead.

   It is not advisable to mix calls to input functions from the stdio
   library with low-level calls to read(2) for the file descriptor
   associated with the input stream; the results will be undefined and
   very probably not what you want.
于 2013-05-17T03:08:43.033 回答
0

始终建议使用 fgets()/scanf() 而不是 gets()。

于 2013-05-17T03:11:39.153 回答
0

通过使用gets() 函数,您无法选择将用户限制为特定的文本长度,这可能会导致缓冲区溢出异常。这就是为什么你不应该使用它。

尝试使用 fgets() 代替: fgets(buff, MAX_LENGTH_ stdin);

祝你好运!

于 2013-05-17T06:23:03.267 回答