繁体   English   中英

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

[英]removing all sub strings of a string in C

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

这是我的代码:

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);
    }
}

代码的快速解释:我将字符串 char 逐个字符地复制到另一个字符串(新)中,每当我看到 substring 时,我的代码继续循环并且什么都不做。 当通过 substring 时,我重新定位下一个 substring。 (我知道这不是很有效,但我是新手,不知道很多方法和功能)

问题是循环不断前进。 当您删除 substring 时,您需要从循环索引i中减去一个,以便再次搜索相同的 position。

您的代码有多个问题:

  • for (int i = 0; i <= strlen(str); i++)的循环效率非常低,因为在循环的每次迭代中都会重新计算str的长度。 你应该简单地写:

     for (int i = 0; str[i];= '\0'; i++)
  • 当您跳过匹配的 substring 时,复制它之后的字符并且i在循环中递增,因此下一次出现的测试未正确测试。

  • append 的代码单个字符效率低下:而不是strncat(new, &ch, 1); 你应该有一个指向目标字符串末尾的指针并写*p++ = str[i]; 并在循环结束后设置 null 终止符。

这是修改后的版本:

#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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM