如果用户输入超过字符数组中设置的字符数,该怎么办?

时间:2014-09-17 17:01:05

标签: c++ c

我无法在任何地方找到任何解释。所以问题是如果用户输入超过字符数组中设置的字符数怎么办?

int main()
{
    char name[2];
    gets(name);
    puts(name);
    return 0;
}

我预计当我输入2个以上的字符来收回错误或者程序崩溃但是它仍然需要大约10个字符。然而,超过12个字符崩溃了。这是怎么回事?

5 个答案:

答案 0 :(得分:3)

您将覆盖缓冲区并导致未定义的行为。这可能导致程序崩溃,其他变量具有更改的值或任何其他问题。

自C ++ 11和C99起,此函数已deprecated。它已在C ++ 14和C11中删除。

答案 1 :(得分:3)

gets()被认为是危险的。这是因为它没有检查你所谈论的那种情况。如果用户输入较长,则整个程序的行为未定义。它可能会崩溃,断段或打印出威廉·莎士比亚的整个作品,并且仍然是根据语言规范的有效行为。所以,请改用C ++ style io或fgets()!

答案 2 :(得分:1)

你现在说的问题是没有使用gets()的原因。

你应该使用fgets()代替

char *fgets(char *str, int n, FILE *stream)

str =指向要存储字符串的内存的指针

n =应该读取的最大字符数

stream =指向要从中读取字符的文件对象的指针。 (要从用户处获取,请在此处使用stdin,即标准输入(键盘))

答案 3 :(得分:0)

您正在获得缓冲区溢出。前两个字符将正确存储在数组中,之后堆栈上不由数组拥有的内存将被覆盖。在某一点(在您的示例中为12个字符)之后崩溃的原因是它开始覆盖执行程序所必需的堆栈上的系统信息。这是一个非常严重的问题(不使用"极端"轻轻地在这里)安全问题,这就是永远不应该使用gets函数的原因。

如果您想了解有关具体情况和所涉及的安全问题的更多信息,建议您阅读本文:Smashing the Stack for Fun and Profit

答案 4 :(得分:0)

C不对数组访问进行任何边界检查,并且gets无法知道目标缓冲区有多大,因此如果输入的字符数多于目标缓冲区的大小,则gets 1}}很乐意在缓冲区结束后立即将这些额外的字符写入内存,这可能会产生以下任何影响:

  • 覆盖另一个变量中的值(这可能会导致非常微妙的问题,需要花费数天才能追查);
  • 覆盖保存在堆栈上的程序状态信息(一个经过验证的恶意软件漏洞利用);
  • 内存访问违规;
  • 没有任何明显的效果(某些东西会被破坏,但无论它是什么都不是“重要”)。

gets在C99中已弃用,已完全从C2011标准中删除; 在您的代码中引入一个主要的失败点/安全漏洞。