1 回答
TA贡献1963条经验 获得超6个赞
用调试观察一下就知道问题在哪了
首先以char a[20] = "abc";
的形式,在内存里数据是这样的:
0x60fefc: 61 62 63 00 00 00 00 00|00 00 00 00 00 00 00 00
0x60ff0c: 00 00 00 00 3d 00 00 00|00 80 3f 00 94 ff 60 00
"abc"后面跟了17个'0'
第二种方式char a[20]; scanf("%s",a);
,在内存里数据是这样的:
0x60fefc: 61 62 63 00 b0 19 40 00|45 00 00 00 08 00 00 00
0x60ff0c: 3d 00 00 00 3d 00 00 00|00 b0 32 00 94 ff 60 00
"abc"后面只有1个'0',后面就不知道是什么乱七八糟的东西了
你程序里的StrLength()函数是自己实现的吗?我姑且当成strlen,strlen是以'\0'为判断字符结束,从而计算长度
而第二种方式执行的时候,以下语句:
for (j = 0; j < StrLength(s) - i + 1; j++) *(p1 + StrLength(s) + StrLength(t) - i - j) = *(p1 + StrLength(s) - i - j);
执行第一次*(p1 + 2) = *(p1 + 1)
后,内存里的数据变成这样:
0x60fefc: 61 62 63 63 b0 19 40 00|45 00 00 00 08 00 00 00
0x60ff0c: 3d 00 00 00 3d 00 00 00|00 b0 32 00 94 ff 60 00
看到了吗,字符串结束的标志'\0'被覆盖了,下次再执行strlen时,字符串的长度就跟预期不一样了
- 1 回答
- 0 关注
- 583 浏览
添加回答
举报