为什么以下代码有误?

时间:2013-05-17 02:54:20

标签: c algorithm output

我最近遇到了一个面试问题,关于以下代码的隐藏问题是什么。我无法察觉它。任何人都可以帮忙吗?

#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;
}

5 个答案:

答案 0 :(得分:5)

函数 gets 接受来自stdin的字符串,不检查缓冲区的容量。这可能导致缓冲区溢出。此处可以使用标准函数fgets()

答案 1 :(得分:2)

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

获取是非常有问题的,因为你无法告诉它只能将'buff'填充到10长度。

答案 2 :(得分:1)

检查说明

Bugs Section of this manual
   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.

答案 3 :(得分:0)

始终建议在gets()上使用fgets()/ scanf()。

答案 4 :(得分:0)

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

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

祝你好运!