有关于C语言指针的问题

img

#include<stdio.h>
#include<string.h>
char * InsertStr(char * s,int pos,char * t)
{
    int  i;
    char *n=s;
    for (i = strlen(s); i >= pos - 1; i--)
        n[i + strlen(t)] = s[i];
    for (i = 0; i < strlen(t); i++)
        n[pos - 1 + i] = t[i];
    return n;
}
int main() 
{
    char a[500],b[500];
    int pos;
    scanf("%s%s%d",a,b,&pos);
    puts(InsertStr(a,pos,b));
    return 0;
}


#include<stdio.h>
#include<string.h>
char n[1000];
char *InsertStr(char *s,int pos,char *t)
{
    int i,j;
    for(i=0;i<pos-1;i++)
    {
        n[i]=s[i];
    }
    int e=i;
    for(j=0;j<strlen(t);j++)
    {
        n[e++]=t[j];
    }
    for(i=pos-1;i<strlen(s);i++)
    {
        n[e++]=s[i];
    }
    n[e]=NULL;
    return n;
}
int main() 
{
    char a[500],b[500];
    int pos;
    gets(a);
    gets(b);
    scanf("%d",&pos);
    puts(InsertStr(a,pos,b));
    return 0;
}

#include<stdio.h>
#include<string.h>
#include<malloc.h>
char *InsertStr(char *s,int pos,char *t)
{
    int i,j;
    char *n=(char *)malloc(1000*sizeof(char));
    for(i=0;i<pos-1;i++)
    {
        n[i]=s[i];
    }
    int e=i;
    for(j=0;j<strlen(t);j++)
    {
        n[e++]=t[j];
    }
    for(i=pos-1;i<strlen(s);i++)
    {
        n[e++]=s[i];
    }
    n[e]=NULL;
    return n;
}
int main() 
{
    char a[500],b[500];
    int pos;
    gets(a);
    gets(b);
    scanf("%d",&pos);
    puts(InsertStr(a,pos,b));
    return 0;
}



#include<stdio.h>
#include<string.h>
char *InsertStr(char *s,int pos,char *t)
{
    int i,j;
    char *n=s;
    for(i=0;i<pos-1;i++)
    {
        n[i]=s[i];
    }
    int e=i;
    for(j=0;j<strlen(t);j++)
    {
        n[e++]=t[j];
    }
    for(i=pos-1;i<strlen(s);i++)
    {
        n[e++]=s[i];
    }
    n[e]=NULL;
    return n;
}
int main() 
{
    char a[500],b[500];
    int pos;
    gets(a);
    gets(b);
    scanf("%d",&pos);
    puts(InsertStr(a,pos,b));
    return 0;
}



这四段代码前两段能够通过,后两个不能通过。想问一下后两个代码有什么问题?

我修改给你

第三段:
在为新字符串 n 分配内存空间时,只分配了 1000 个字节的空间,这可能不足以容纳插入后的字符串。如果输入的原字符串 s 较长,插入的字符串 t 也较长,就会导致 n 的空间不够用,从而发生内存访问错误。

因此,建议动态地分配足够多的内存空间给 n。此外,在最后还需要将 n 在结尾处加上一个空字符 '\0',表示字符串结束,否则输出的结果可能会出现错误。

img

#include <stdio.h>
#include <string.h>
#include <stdlib.h> // 动态内存分配需要包含该头文件

char* InsertStr(char* s, int pos, char* t) {
    int i, j;
    int slen = strlen(s);
    int tlen = strlen(t);
    char* n = (char*)malloc(sizeof(char) * (slen + tlen + 1)); // 动态分配足够的内存空间
    for(i = 0; i < pos-1; i++) { // 将原字符串中 [0, pos-2] 的部分复制到新字符串
        n[i] = s[i];
    }
    for(j = 0; j < tlen; j++) { // 将待插入字符串 t 插入到新字符串的相应位置
        n[i+j] = t[j];
    }
    for(; i < slen; i++) { // 将原字符串中 [pos-1, slen-1] 的部分复制到新字符串
        n[i+tlen] = s[i];
    }
    n[slen+tlen] = '\0'; // 在结尾处添加空字符 '\0'
    return n;
}

int main() {
    char s[500], t[500];
    int pos;
    gets(s);
    gets(t);
    scanf("%d", &pos);
    char* res = InsertStr(s, pos, t);
    puts(res);
    free(res); // 记得释放动态分配的内存
    return 0;
}


第四个:
在将原字符串赋值给 n 时,只是将指针 n 指向了 s,并没有单独为 n 分配内存空间。这样的话,在修改 n 的同时也会影响到原字符串 s,可能造成不可预料的后果。

因此,建议动态地为新字符串 n 分配内存空间,并使用 strcpy() 函数复制原字符串 s 的内容到 n 中,以避免对原字符串的影响。

img

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char* InsertStr(char* s, int pos, char* t) {
    int slen = strlen(s);
    int tlen = strlen(t);
    char* n = (char*)malloc(sizeof(char) * (slen + tlen + 1));
    strcpy(n, s); // 复制原字符串到新字符串中
    for(int i = pos-1, j = 0; j < tlen; i++, j++) {
        n[i+tlen] = n[i]; // 将原字符串 [pos-1, slen-1] 的部分向后移 tlen 个位置
        n[i] = t[j]; // 将待插入字符串 t 插入到新字符串的相应位置
    }
    n[slen+tlen] = '\0'; // 在结尾处添加空字符 '\0'
    return n;
}

int main() {
    char s[500], t[500];
    int pos;
    gets(s);
    gets(t);
    scanf("%d", &pos);
    char* res = InsertStr(s, pos, t);
    puts(res);
    free(res); // 记得释放动态分配的内存
    return 0;
}


n[e]=’\0’;而不是NULL
char *n=s; 这里n就是s,所以你在n上操作,就把s冲毁了。

该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
在后两个代码中,出现了指针访问越界的问题,可能会导致程序崩溃或者输出错误结果。
【3】
具体来说,第三段代码中,在函数InsertStr中,使用了动态内存分配函数malloc,但是没有对分配的内存进行足够的初始化,比如将分配的内存清零,导致可能会出现未定义的行为。
【4】
第四段代码中,在函数InsertStr中,使用了指针s来向指针n进行赋值。但是在for循环中,只对s进行了部分的拷贝操作,没有将s的全部内容拷贝到n中,因此在函数返回后,n指向的字符串可能不完整,出现了指针访问越界的问题。


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

第三段代码,char *n=(char )malloc(1000sizeof(char));在函数结束之后,malloc的地址会被系统回收,所以你return回去的地址这个时候就变成野指针了;第四段代码,char *n=s; n指向s存储的地址,在将t里面的值赋值给n的时候,其实也会破坏掉s里面的值,最后再把pos后面的s的值赋值给n,s里面就不是它原始的值了