请编写函数,删除子串。
函数接口定义:
char* StrRemove(char *str, int idx, int len);
说明:str
为指示字符串起始地址的指针,idx
为子串的起始位置(下标),len
为子串的长度。函数删除字符串 str
中从下标 idx
处开始、长度为 len
的子串,函数值为 str
。若 len
值不正确,则自动修正。若 idx
值不正确,则不删除子串。
要求:直接在原数组上完成操作,不要借助其它数组。
裁判测试程序样例:
#include <stdio.h>
char* StrRemove(char *str, int idx, int len);
int main()
{
char a[1024];
int i, n;
gets(a);
scanf("%d%d", &i, &n);
StrRemove(a, i, n);
puts(a);
return 0;
}
/* 你提交的代码将被嵌在这里 */
输入样例1
abcd
1 2
输出样例1
ad
输入样例2
abcd
1 5
注:5 不正确,按3处理。
输出样例2
a
输入样例3
abcd
2 -5
注:-5 不正确,按 0 处理。
输出样例3
abcd
输入样例4
abcd
-1 2
输出样例4
abcd
参考答案:
char* StrRemove(char *str, int idx, int len)
{
//处理idx不越界
int length=0;
char *temp=str;
while(*temp)//计算字符串总长度
{
length++;
temp++;
}
if(idx<0||idx>=length)//起始下标小于0直接输出
{
return NULL;
}
//处理len不越界
if(len<0)//小于0,按 0 处理
{
len=0;
}
int length2=0;
char *temp2=str+idx;
while(*temp2)//计算从下标位置到末尾的距离
{
length2++;
temp2++;
}
if(len>length2)//超过的按到末尾的最长长度表示
{
len=length2;
}
//删除操作(本质就是从idx的位置开始跳过len长度的字符串,并将后面的字符串往前移)
char *p=str+idx;
char *q=str+idx+len;
while(*q)
{
*p++=*q++;
}
*p='\0';
return str;
}
拓展:解释为啥删除子串之后要在末尾添加空字符(答案由chatgpt给出,仅供参考)
NO.26
若有疑问,欢迎提出!