请编写函数,在目的串中插入源串。
函数原型
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;
}