1996-c-四

//基本思想生成一条新串,不是在原有串上进行复杂操作

int delsubStr(char* str_in,char* str_sub, char* str_out)
{
    int start = 0;       /* 记录开始比较下标 */
    int count = 0;    /* 记录子串个数 */
    int j = 0;              /* 记录子串的下标 */
    int k = 0;            /* 记录结果字符串的下标 */
    int i;            /*循环变量*/


    for (i = 0; str_in[i] != '\0'; i++)
    {
       start = i;      /* 临时保存比较下标 */
       j = 0;           /* 每次开始比较的时候,子串都从0开始,如果第一个字符相等,
                               那么就接着比较下一个字符,否则进入下一轮循环 */

       while ((str_in[i] != '\0')&&(str_sub[j] != '\0')&&(str_in[i] == str_sub[j]))
       {
           i++;        /* 源串后移一个位置 */
           j++;        /* 字串后移一个位置 */
       }

       if (str_sub[j] != '\0')                             /* 如果不是子串 */
       {
           str_out[k++] = str_in[start];     /* 将当前比较的这个字符存入结果 */
       }
       else                         /* 如果是子串 */
       {
           count++;
           i--;           /* 因为返回for循环之后,进行下一次循环的时候还要进行i++的运算的 */
       }
    }

    return count;
}


//用于测试
int main()
{
    char* str_in = "cjhsbdvjhvhsvcibi123aschvajck123aanb123";
    char* str_sub="123";
    char str_out[100]={0};

    int   count =  delsubStr(str_in,str_sub,str_out);

    printf("子串:%s\n",str_sub);
    printf("个数:%d\n",count);
    printf("原串:%s\n",str_in);
    printf("结果:%s\n",str_out);

    return 0;
}

参考原文,略有修改。

http://blog.csdn.net/zhangyuehua123/article/details/6922662 //之前版本,过于复杂


#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
#define MAXSIZE_SUB 50

int main()
{
    int seek_substr_in_str(char *sub_str, char *str, char **head, char **tail);//查找函数声明 
    void del_substr_in_str(char *start, char *end);//删除函数声明 

    char *start_point = NULL;//开始点 
    char *end_point = NULL;//结束点 

    char string[MAXSIZE];//待查找串 
    char sub_string[MAXSIZE_SUB];//子串 
   
    int ret = 0;//循环停止标识 
    
    scanf("%s", string);
    scanf("%s", sub_string);

    while (ret != -1)
    {
        ret = seek_substr_in_str(sub_string, string, &start_point, &end_point);//查找子串位置  

        if (ret == 1)
        {
            del_substr_in_str(start_point, end_point);//删除子串 
        }
    }

    printf("string:%s\n", string);//输出查找、删除完成串 
    
}

/*
**查找子串,返回子串在字符串中的开始位置和结束位置
*/
int seek_substr_in_str(char *sub_str, char *str, char **head, char **tail)
{
    char *tmp_str = NULL;
    char *tmp_substr = NULL;
    char *tmp = NULL;
   
    char *p = NULL;
    char *p_sub = NULL;

    tmp = str;
    tmp_substr = sub_str;

    while (*tmp)
    {
        p = tmp;
        p_sub = tmp_substr;

        while(*p_sub)
        {
            if (*p == *p_sub)
            {
                p++;
                p_sub++;
            }
            else
            {
                break;
            }
        }

		// 代表查找成功 
        if (*p_sub == NULL)
        {
            p--;//抵消由于最后一次p++引起的指针移动 
            *head = tmp;//本次指针初始位置 
            *tail = p;//本次查找到子串的最后位置 
            return 1;
        }
        tmp++;//待查找串指针下移 
    }

    return -1;//查找失败 

}

/*
**删除子串
**删除的方法是:从子串位置后的第一个元素开始往前面移动子串个长度,将子串的内容覆盖
*/
void del_substr_in_str(char *start, char *end)
{
    char *p = end + 1;
    int distance = 0;

    distance = end - start + 1;//求出子串长度 
    //移动、覆盖 
    while(*p)
    {
        *(p - distance) = *p;
        p++;
    }
    *(p - distance) = *p;//p指向原串尾部,将字符串结束标志放置到新串尾 
}