删除C中字符串的所有子字符串

删除C中字符串的所有子字符串,c,string,substring,C,String,Substring,我一直试图从给定字符串中删除所有出现的子字符串,但我的代码有一个bug,我不知道如何解决。当两个子字符串背对背时,我的代码只能删除其中一个子字符串 这是我的代码: void removeSub(char *str, char *sub, char *new) { int len = strlen(sub); char *subp = strstr(str, sub); int position = subp - str; for (int i = 0; i <

我一直试图从给定字符串中删除所有出现的子字符串,但我的代码有一个bug,我不知道如何解决。当两个子字符串背对背时,我的代码只能删除其中一个子字符串

这是我的代码:

void removeSub(char *str, char *sub, char *new) {
    int len = strlen(sub);
    char *subp = strstr(str, sub);
    int position = subp - str;
    for (int i = 0; i <= strlen(str); i++) {
        if (i >= position && i < position + len) {
            continue;
        }

        if (i == position + len - 1) {
            // update position
            subp = strstr(str + i - 1, sub);
            position = subp - str;
        }
        
        char ch = str[i];
        strncat(new, &ch, 1);
    }
}
void removeSub(char*str、char*sub、char*new){
int len=strlen(sub);
char*subp=strstrstr(str,sub);
int位置=subp-str;
对于(int i=0;i=position&&i

代码的快速解释:我将字符串逐字符复制到另一个字符串(新)中,每当我看到子字符串时,我的代码将继续循环,而不执行任何操作。当传递一个子字符串时,我重新定位下一个子字符串。(我知道这不是很有效,但我是新手,不知道很多方法和功能)

问题是循环不断前进。删除子字符串时,需要从循环索引
i
中减去一个子字符串,以便再次搜索同一位置。

您的代码有多个问题:


  • 代码> >(int i=0);我是否在调试器中运行代码,一步一步地检查代码变量的值?如果没有,然后考虑这样做。这有帮助。当代码>子< /代码>不在<代码> STR < /代码>时,会发生什么?在代码>之后,您有一个额外的分号(I==位置+LeN-1)。“<代码> >如果有一个“空”语句,下面的块在代码> {}} /代码> s将无条件地执行。@当我在这里复制代码时,我删除了一个注释,它是代码的一部分,这是发生的,这不是从字符串中删除子串的问题,考虑子串<代码>“伤害”。,是否要删除
    “harm”
    (如果它显示为一个单词)以及
    中的“harm”
    它是另一个单词中包含较少的字符串吗?这确实有帮助,感谢你,这曾经是一个被接受的答案,直到更好的答案出现。我注意到了错误,尝试进行了一个小的更正,在拉字符串时发现我将重写算法,决定OP自己做会受益更多。哈他没有评论,我不会删除它。
    for (int i = 0; str[i] != '\0'; i++)
    
    #include <string.h>
    // remove all occurrences of sub in str into destination buffer new
    // return a pointer to the destination string
    char *removeSub(cont char *str, const char *sub, char *new) {
        char *p = new;
        size_t len = strlen(sub);
        if (len > 0) {
            const char *subp;
            while ((subp = strstr(str, sub)) != NULL) {
                memcpy(p, str, sub - str);
                p += sub - str;
                str = sub + len;
            }
        }
        strcpy(p, str);
        return new;
    }
    
    // remove all occurrences of sub in str into destination buffer new
    // return a pointer to the destination string
    char *removeSub(cont char *str, const char *sub, char *new) {
        char *p = new;
        while (*str) {
            if (*str == *sub) {  /* potential substring match */
                for (size_t i = 1;; i++) {
                    if (sub[i] == '\0') {  /* substring match */
                        str += i;
                        break;
                    }
                    if (str[i] != sub[i]) {
                        *p++ = *str++;
                        break;
                    }
                }
            } else {
                *p++ = *str++;
            }
        }
        *p = '\0';
        return new;
    }