删除字符串中的子串
请编写一个函数,删除一个字符串的一部分。函数原型如下:
int del_substr(char *str, char const *substr)
函数首先应判断substr是否出现在str中。如果它并未出现,函数就返回0;如果出现,函数应该把str中位于该子串后面的所有字符复制到该子串的位置,从而删除这个子串,然后函数返回1。如果substr多次出现在str中,函数只删除第1次出现的子串。函数的第2个参数绝不会被修改。
举个例子,假定str指向ABCDEFG。如果substr指向FGH、CDF或XABC,函数应该返回0,str未作任何修改。但如果substr指向CDE,函数就把str修改为指向ABFG,方法是把F、G和结尾的NUL字节复制到C的位置,然后函数返回1。不论出现什么情况,函数的第2个参数都不应该被修改。
要求:a.你不应该使用任何用于操纵字符串的库函数(如strcpy, strcmp, 等)。
b.函数中的任何地方都不应该使用下标引用。
一个值得注意的是,空字符串是每个字符串的一个子串,如果字符串中删除一个空字符串不会产生变化。
/*
** Delete a portion of a string.
*/
#include <stdlib.h>
#include <stdio.h>
#define TRUE 1
#define FALSE 0
int del_substr(char *str, char const *substr);
int main()
{
char str1 [] = "xyzabcjklmn";
char const * str2= "axc";
int ret;
printf("before delete: %s\n", str1);
printf("will delete che chars: %s\n", str2);
ret = del_substr(str1, str2);
printf("After delete : %s\n", str1);
printf("ret = %d\n", ret);
system("pause");
return 0;
}
int del_substr(char *str, char const *substr)
{
char const * subP;
char *strP;
char *temp;
int flag = TRUE;
strP = str;
if((!*str) || *substr == '\0')
return FALSE;
while(*strP)
{
temp = strP;
for(subP=substr; *subP; subP++)
{
if(*strP == *subP)
{
strP++;
//flag = FALSE;
continue;
}
break;
}
if(*subP == '\0')
{
flag = FALSE;
while(*temp++ = *strP++)
;
break;
}
if(flag)
strP++;
}
if(*strP == '\0' && *subP != '\0')
{
return FALSE;
}
return TRUE;
}
源程序借鉴于:http://blog.sina.com.cn/s/blog_798f21a00100wy2i.html
主要做了两处修改:(这样才满足题意要求)
flag=FALSE;由原来蓝色处移到现在的红色字体处;
另外添加了
if(*strP == '\0' && *subP != '\0')
{
return FALSE;
}