【发布时间】:2021-07-31 07:46:03
【问题描述】:
我已经声明了两个 char 字符串(str1 和 str2)的大小相同。之后,我通过gets()函数读取一个字符串并将其存储在str1上,然后将str1复制到str2。当它们显示时,我意识到 str2 可以存储比它的大小更多的字符?
这是我的代码:
#include<stdio.h>
#include<string.h>
void main()
{
char str1[20], str2[20];
printf("Enter the first string:");
gets(str1);
strcpy(str2,str1);
printf("First string is:%s\tSecond string is:%s\n",str1,str2);
}
这里的输出:
Enter the first string: Why can str2 store more characters than str1?
First string is:ore characters than str1? Second string is:Why can str2 store more characters than str1?
提前谢谢大家
【问题讨论】:
-
它不能——你在 str2 结束后覆盖内存并调用未定义的行为。它似乎起作用的事实是未定义行为的更有趣的方面之一。任何事情都可能发生,包括无法观察到明显错误的情况(例如,因为在 str2 结束后被覆盖的字节中没有发生“重要”的事情)。不过,你不能依赖它工作
-
这是一个很好的例子,说明为什么在任何情况下您都应该从不使用
gets。你的编译器应该对你大喊大叫。gets函数允许将任意信息写入内存。 -
考虑查找缓冲区溢出、未定义的行为以及为什么
gets很危险。 -
scanf(str1);- 最好阅读scanf的手册页。您正在寻找scanf("%19s", str1); -
我建议用有意义的东西替换标题,例如“字符串怎么会比它声明的长度长?”