6-4 插入子串*分数 20

请编写函数,在目的串中插入源串。

函数原型

char* StrInsert(char *dst, int idx, const char *src);

说明:dst 为指示目的串起始地址的指针,idx 为插入位置(下标),src 为指示源串起始地址的指针。函数在目的串 dst 下标 idx 处插入源串 src,函数值为 dst。若 idx 不正确,则不插入子串。

要求:直接在原数组上完成操作,不要借助其它数组。

裁判程序

#include <stdio.h>

char* StrInsert(char *dst, int idx, const char *src);

int main()
{
    char a[1024], b[1024];
    int i;
    gets(a);
    scanf("%d%*c", &i);
    gets(b);
    StrInsert(a, i, b);
    puts(a);
    return 0;
}

/* 你提交的代码将被嵌在这里 */

输入样例1

abcd
0
ef

输出样例1

efabcd

输入样例2

abcd
2
ef

输出样例2

abefcd

输入样例3

abcd
4
ef

输出样例3

abcdef

输入样例4

abcd
10
ef

输出样例4

abcd

超时答案(两个循环易造成超时):

char* StrInsert(char* dst, int idx, const char* src) {
    int m, n = 0;
    m = n = 0;
    int st = 0;
    int st1 = 0;
    for (;dst[m]!='\0'; m++) {//m为dst串的长度
    }
    for (; src[n] != '\0'; n++) {//n为src串的长度
    }
    if(idx<0||idx>m){//插入位置异常则不变
        return dst;
    }
    for (; st1 < n; st1++) {//更改插入n次
        for (st = m+st1; idx+st1 <= st; st--) {//移动位置st次
            dst[st + 1] = dst[st];//移动字符位置
        }
        dst[st+1] = src[st1];//插入字符
    }
    return dst;
}

答案:

char* StrInsert(char* dst, int idx, const char* src) {
    int m, n = 0;
    m = n = 0;
    int st = 0;
    int st1 = 0;
    for (;dst[m]!='\0'; m++) {
    }
    
    for (; src[n] != '\0'; n++) {
    }
    if(idx<0||idx>m){
        return dst;
    }
    for (;idx<=m;m--) {
        dst[m + n] = dst[m];//为dst串中要插入的位置留下空位(从后向前防止覆盖)
    }
    for (;st<n;st++) {
        dst[idx+st] = src[st];//在空位中逐一的插入
    }//时间为(m+n)非(m*n)不超时
    return dst;
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值