为了账号安全,请及时绑定邮箱和手机立即绑定

为什么直接声明的字符串和输入的字符串不同(串插入问题)

为什么直接声明的字符串和输入的字符串不同(串插入问题)

C
FFIVE 2018-12-11 15:44:00
题目描述串插入 StrInsert(s,i,t)操作条件:串 s,t 存在,1≤i≤StrLength(s)+1。操作结果:将串 t 插入到串 s 的第 i 个字符位置上,s 的串值发生改变。题目来源及自己的思路来源:数据结构上机题目思路:直接利用指针对字符数组中的字符进行移动和赋值相关代码void StrInsert(char * s, int i, const char * t){    if (i<1 || i>StrLength(s) + 1)     {        puts("函数StrInsert参数有问题!");        return;     }    char * p1;     p1 = s;    int j;     p1 = p1 + i - 1;    for (j = 0; j < StrLength(s) - i + 1; j++)         *(p1 + StrLength(s) + StrLength(t) - i - j) = *(p1 + StrLength(s) - i - j);//后面的元素的移动     s[StrLength(s) + StrLength(t)] = '\0';    for (j = 0; j < StrLength(t); j++)         *(p1 + j) = t[j];//对移动之后空出来的位置进行赋值}你期待的结果是什么?实际看到的错误信息又是什么?在字符串t只有一个字符的时候,此处假设这个字符串为"d"当待插入的字符串s赋值以 char a[20] = "abc";的形式时,调用该函数StrInsert(a,2,"d")可以使得a = "adbc"当待插入的字符串s赋值以 char a[20]; scanf("%s",a);时,调用该函数直接导致内存读取错误,打印出来的字符串是类似于“烫烫烫......”希望能有大佬解答这个问题,非常感谢!!!
查看完整描述

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时,字符串的长度就跟预期不一样了


查看完整回答
反对 回复 2018-12-11
  • 1 回答
  • 0 关注
  • 583 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信