函数原型:
int del_substr(char *str,char const *substr);
首先应该判断substr是否在str中,如果并未出现则返回0;
如果出现,函数应该吧str中位于该子串后面的所有字符复制到该子串的位置,从而删除这个子串,然后函数返回1。如果substr多次出现在str中,函数只删除第一次出现的子串,函数的第二个参数绝对不应该被修改。
源码:
int del_substr(char *str,char const *substr)
{
if(str == NULL || substr == NULL)
{
return 0;
}
//标记str中substr开始的位置
char * begin = str;
//标记str中substr结束的位置
char * end = str;
//substr用于比较的游标指针
char const * index = substr;
while(*begin != '\0' && *end != '\0')
{
//在str中寻找substr
while(*begin != *index)
{
begin++;
}
end = begin + 1;
index++;
while(*index == *end && *index != '\0' && *end != '\0')
{
index++;
end++;
}
//如果index和end同时到达各自的字符串尾部,substr子串在str中被找到
//例如str:"abcdeXYZ",substr:"XYZ"
if(*index == '\0' && *end == '\0')
{
*begin = '\0';
printf(str);
return 1;
}
/* 如果index到达substr字符串尾部,而end没有到达str的尾部,substr子串在str中被找到
* 例如str:"abcdeXYZmn",substr:"XYZ"
*/
else if(*index == '\0' && *end != '\0')
{
while(*begin++ = *end++);
printf(str);
return 1;
}
/* 如果index未到达substr字符串尾部,而end有到达str的尾部,substr子串在str中未被找到
* 例如str:"abcdeXYZmn",substr:"XYZmnST"
*/
else if(*index != '\0' && *end == '\0')
{
printf(str);
return 0;
}
/*字符串匹配尚未完成
* 例如str:"XYZabcdeXYZmnSTghd",substr:"XYZmnST"
*/
else
{
begin++;
end = begin;
index = substr;
}
}
printf(str);
return 0;
}
对于str包含多个substr的情况如果需要删除str中所有的substr可以使用上面的函数进行递归调用。