删除字符串的一部分

《C和指针》第6章编程练习:
请编写一个函数,删除一个字符串的一部分,函数的原型如下:
int del_substr(char *str,char const *substr )
函数首先应该判断substr是否出现在str中,如果它并未出现,函数就返回0;如果出现,函数应该把str 中位于该子串后面的所有字符复制到该子串的位置,从而删除这个子串,然后函数返回1。如果substr多次出现在str中,函数只删除第1次出现的子串,函数的第二个参数绝不被修改。
要求:1不能使用任何操纵字符串的库函数 
     	   2  不能使用下标
后面有源码及注释

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int del_substr(char *str,char const *substr);//函数声明

int main()
{
    int ret = 0;
    char str[20] ;
    char substr[20] ;
    printf("please input str substr:\n");
    scanf("%s%*c",str);
    scanf("%s",substr);
    printf("str:%s,substr:%s\n",str,substr);
    ret = del_substr(str,substr);
    printf("the change str:%s\n",str);
    printf("%d\n",ret);
    return 0;
}
/*
**完成自己的前count个字符比较函数,相同返回0
*/
int my_strncmp(const char *s1,const char *s2,int count)
{
    const char *c1 = s1;
    const char *c2 = s2;
    while(--count&&(*c1 == *c2))
    {
        c1 ++;
        c2 ++;
    }
    return *c1 - *c2;
}
/*
**完成自己的检测字符串长度函数,返回字符串长度
*/
int my_strlen(const char *str)
{
    const char *s1 = str;
    for(s1 = str;*s1 != '\0';s1++)
    {
        ;
    }
    return s1 - str;
}
/*
**删除字符串函数,成功返回1,str中删除第一个出现的substr;失败返回0,str不变
*/
int del_substr(char *str,char const *substr)
{
    int flag = 0;//控制只删除一次的变量
    char *ptr = str;
    char *src = str;
    int len = my_strlen(substr);
    while(*src != '\0')
    {
        if(flag == 0&&my_strncmp(src,substr,len) == 0)
        {
            src = src + len;//匹配成功,src的指向后移len
            flag = 1;
        }
        *ptr++ = *src++;//将src指向的字符赋给ptr指向的字符
    }
    *ptr = '\0';
    str = ptr;//将修改好的字符串赋给str
    if(flag == 1)//如果字符串被改动过一次,返回1
    {
        return 1;
    }
    return 0;
}


发布了15 篇原创文章 · 获赞 73 · 访问量 11万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章