关于#字符串#的问题,如何解决?

【问题描述】

编写一个函数,利用指针在字符串s中的指定位置pos处(这里插入的位置是从1开始,不是下标)插入字符串。插入的位置和内容是从键盘输入

要求:子函数 char *InsertStr(char *s,int pos,char *t)

【输入形式】

输入主串s,输入插入的子串t,输入插入位置pos。
【输出形式】

输出插入后字符串
【样例输入】

输入:

abcde

KOBE

2

【样例输出】

aKOBEbcde

我这道题目写的有什么问题?OJ过不了。

img

img

#include<stdio.h>
#include<string.h>
char *InsertStr(char *s,int pos,char *t)
{
    
    char n[1000];
    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];
    }
    char * N=n;
    return N;
}
int main() 
{
    char a[500],b[500];
    int pos;
    scanf("%s%s%d",a,b,&pos);
    printf("%s",InsertStr(a,pos,b));
    return 0;
}


不要直接返回在堆栈上定义的局部变量N,因为它已经无效了
可以动态分配,具体看我给你写的那个程序

img

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    答案:

    优化字符串插入函数需要考虑到以下几点:

    1. 减少内存复制

    在字符串插入时,需要将插入位置以及后面的字符往后移动,为新字符串腾出空间。这个过程会涉及到大量的内存复制,这可以通过使用指针来优化。具体实现见代码:

    char *InsertStr(char *s, char *t, int pos) {
        int len1 = strlen(s);
        int len2 = strlen(t);
    
        if (pos < 1 || pos > len1 + 1) { // 插入位置非法,直接返回原字符串
            return s;
        }
    
        char *result = (char *)malloc(sizeof(char) * (len1 + len2 + 1));
        char *p1 = s, *p2 = t, *p3 = result;
    
        // 先将插入位置之前的字符拷贝到新的字符串中
        for (int i = 0; i < pos - 1; i++) {
            *(p3++) = *(p1++);
        }
    
        // 然后将要插入的字符串拷贝到新字符串中
        for (int i = 0; i < len2; i++) {
            *(p3++) = *(p2++);
        }
    
        // 最后将剩余的字符拷贝到新字符串中
        for (int i = pos - 1; i < len1; i++) {
            *(p3++) = *(p1++);
        }
    
        *p3 = '\0'; // 注意要在新字符串结尾添加'\0'
        return result;
    }
    
    1. 避免内存泄漏

    使用了动态分配内存之后,需要确保在函数返回之前将这些内存释放掉。否则就会造成内存泄漏。可以使用以下代码来释放动态分配的内存:

    void FreeMemory(char *p) {
        if (p != NULL) {
            free(p);
            p = NULL;
        }
    }
    
    char *s = "hello, world";
    char *t = "Jack";
    char *result = InsertStr(s, t, 6);
    printf("%s\n", result);
    FreeMemory(result);
    
    1. 注意字符串的边界条件

    在实现字符串插入函数时,需要注意到边界条件的处理。如果插入位置小于1或大于原字符串长度加1,则直接返回原字符串。如果要插入的字符串为空,则直接返回原字符串。具体实现见代码。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^