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

题目描述

串插入 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);时,调用该函数直接导致内存读取错误,打印出来的字符串是类似于“烫烫烫......”

希望能有大佬解答这个问题,非常感谢!!!


FFIVE
浏览 584回答 1
1回答

神不在的星期二

用调试观察一下就知道问题在哪了首先以char a[20] = "abc";的形式,在内存里数据是这样的:0x60fefc: 61 62 63 00 00 00 00 00|00 00 00 00 00 00 00 000x60ff0c: 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 000x60ff0c: 3d 00 00 00 3d 00 00 00|00 b0 32 00 94 ff 60 00"abc"后面只有1个'0',后面就不知道是什么乱七八糟的东西了你程序里的StrLength()函数是自己实现的吗?我姑且当成strlen,strlen是以'\0'为判断字符结束,从而计算长度而第二种方式执行的时候,以下语句:&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(j&nbsp;=&nbsp;0;&nbsp;j&nbsp;<&nbsp;StrLength(s)&nbsp;-&nbsp;i&nbsp;+&nbsp;1;&nbsp;j++) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*(p1&nbsp;+&nbsp;StrLength(s)&nbsp;+&nbsp;StrLength(t)&nbsp;-&nbsp;i&nbsp;-&nbsp;j)&nbsp;=&nbsp;*(p1&nbsp;+&nbsp;StrLength(s)&nbsp;-&nbsp;i&nbsp;-&nbsp;j);执行第一次*(p1 + 2) = *(p1 + 1)后,内存里的数据变成这样:0x60fefc: 61 62 63 63 b0 19 40 00|45 00 00 00 08 00 00 000x60ff0c: 3d 00 00 00 3d 00 00 00|00 b0 32 00 94 ff 60 00看到了吗,字符串结束的标志'\0'被覆盖了,下次再执行strlen时,字符串的长度就跟预期不一样了
打开App,查看更多内容
随时随地看视频慕课网APP