我无法在任何地方找到任何解释。所以问题是如果用户输入超过字符数组中设置的字符数怎么办?
int main()
{
char name[2];
gets(name);
puts(name);
return 0;
}
我预计当我输入2个以上的字符来收回错误或者程序崩溃但是它仍然需要大约10个字符。然而,超过12个字符崩溃了。这是怎么回事?
答案 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标准中删除; 将在您的代码中引入一个主要的失败点/安全漏洞。