C和指针 学习(一)第六章第二题

编写一个函数,删除一个字符串的一部分。函数原型如下:

int del_substr(char * str, char const * substr)

 

需要注意的点:

1、注意指针的左值与右值区别;

2、满足题目要求:1、出现多次只删除第一次出现的substr;2、不应该使用任何操纵字符串的库函数;3、不应该使用下标引用;

3、注意原型要求,substr为指向字符常量的指针,不能和普通指针相转化。

 

方法一:不借助自定义对比函数:

 

int del_substr2(char *strchar const *substr){
    if (str == NULL || substr == NULL)
        return 0;
    char * s1 = NULL
    while (*str != '\0')
    {
        int nLenth = 0;
        s1 = str;
        while (*s1 != '\0' && *substr != '\0' && *s1 == *substr){
            nLenth++;
            s1++;
            substr++;
        }
        if (*substr == '\0'){       //全匹配的标志
            s1 -= nLenth;
            while(*(s1 + nLenth) != '\0'){
                *s1 = *(s1 + nLenth);
                s1++;
            }
            *s1 = '\0';
            return 1;
        }
        else{
            substr -= nLenth;
        }
        str++;
    }
    return 0;
}
方法二:借助一个判别是否有子串的函数:
int substrcmp(const char *sourceconst char *str) {
    if (source == NULL && str == NULL) {
        return 0;
    }
    int len = 0;
    for (;*source != '\0' && *str != '\0';++source, ++str) {    // 两个字符串都没有结束
        if (*source != *str) {      // 两个字符串内容不相同
            return 0;               // 返回0
        }
        ++len;
    }
    if (*str != '\0') {     // 子字符串未遍历结束
        return 0;           // 返回0
    }
    return len;             // 两个字符串相等,返回相等长度
}

// 删除str中substr部分
int del_substr1(char *strconst char *substr) {
    if (str == NULL || substr == NULL) {
        return 0;
    }
    int len = 0;
    int count = 0;
    while(*str!= '\0'){
        len = substrcmp(strsubstr);
        if (len){
            while(*(str + len) != '\0'){
                *str = *(str + len);
                str++;
            }
            *str = '\0';
            return 1;
        }
        str++;
    }
    return 0;
}
posted @ 2021-05-17 17:21  elfte  阅读(87)  评论(0)    收藏  举报