|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
下列代码时想将a连接到b后面,然后输出a和b,但是输出时a数组被改变了,想了很久都不知道为什么,大佬棒棒忙把!
#include<stdio.h>
void strcate(char [],char []);
int main(void)
{
char a[]="Language", b[]="Programming";
strcate(b,a);
printf("%s %s\n",b,a);
}
void strcate(char t[],char s[])
{
int i = 0, j = 0;
while(t[i++]);
i-=1;
while((t[i++] = s[j++] ) != '\0');
}
本帖最后由 jackz007 于 2020-11-5 22:09 编辑
- char a[] = "Language" , b[]="Programming" ;
复制代码
这一句在程序编译的时候,会为 a 分配 9 个字符空间,恰好能够容纳字符串 "Language" 以及末尾的 '\0';为 b 分配 12 个字符空间,恰好能够容纳字符串 "Programming" 以及末尾的 '\0'。函数 strcate(char t[] , char s[]) 是拼接字符串的,会把字符串 s 拼接到 字符串 t 的末尾。执行 strcate(b , a) 的结果,会把字符串 a 拼接到字符串 b 的末尾,这样拼接后的字符串 b 的长度将是 11 + 8 = 19,外加末尾的 '\0' ,字符串 b 所需要的空间是 20 个字符。可是,b 的容量在编译阶段就已经固定了,是 12,差了 8 个字符空间,显然是小了,这就不可避免的要侵占其它变量所占用的后续存储空间,具体会伤害到函数中的那一个变量我们不得而知(楼主遇到的奇怪现象应该与此直接相关)。这就给程序运行带来了不确定性和隐患,所以,我们一定要尽力避免出现这种情况。
解决问题的方法很简单,只要把 b 的容量定义大一些就可以了。
- char a[] = "Language" , b[24] = "Programming" ;
复制代码
|
|