C语言如何高效删除字符串中的指定子串?

99ANYc3cd6
预计阅读时长 11 分钟
位置: 首页 C语言 正文

C语言删除字符串中的指定字符串

在C语言中删除字符串中的指定子字符串,可以通过以下几种方法实现:

c语言删除字符串中的指定字符串
(图片来源网络,侵删)

使用字符串库函数

#include <stdio.h>
#include <string.h>
void removeSubstring(char *str, const char *sub) {
    char *p = str;
    while ((p = strstr(p, sub)) != NULL) {
        memmove(p, p + strlen(sub), strlen(p + strlen(sub)) + 1);
    }
}
int main() {
    char str[] = "Hello world, welcome to the world of C programming";
    char sub[] = "world";
    printf("原始字符串: %s\n", str);
    removeSubstring(str, sub);
    printf("删除后的字符串: %s\n", str);
    return 0;
}

手动实现删除功能

#include <stdio.h>
#include <string.h>
void removeSubstringManual(char *str, const char *sub) {
    int str_len = strlen(str);
    int sub_len = strlen(sub);
    if (sub_len == 0) return;
    for (int i = 0; i <= str_len - sub_len; ) {
        if (strncmp(str + i, sub, sub_len) == 0) {
            // 找到匹配,删除子字符串
            memmove(str + i, str + i + sub_len, str_len - i - sub_len + 1);
            str_len -= sub_len;
        } else {
            i++;
        }
    }
}
int main() {
    char str[] = "This is a test string for testing";
    char sub[] = "test";
    printf("原始字符串: %s\n", str);
    removeSubstringManual(str, sub);
    printf("删除后的字符串: %s\n", str);
    return 0;
}

使用指针操作

#include <stdio.h>
#include <string.h>
void removeSubstringPointer(char *str, const char *sub) {
    char *p = str;
    char *found;
    int sub_len = strlen(sub);
    if (sub_len == 0) return;
    while ((found = strstr(p, sub)) != NULL) {
        memmove(found, found + sub_len, strlen(found + sub_len) + 1);
        p = found;
    }
}
int main() {
    char str[] = "Remove all occurrences of this word";
    char sub[] = "this";
    printf("原始字符串: %s\n", str);
    removeSubstringPointer(str, sub);
    printf("删除后的字符串: %s\n", str);
    return 0;
}

注意事项

  1. 这些方法都会修改原始字符串
  2. 如果子字符串为空,函数应该直接返回而不做任何操作
  3. 对于重叠的子字符串(如删除"aa"从"aaaa"中),这些方法都能正确处理
  4. 内存操作使用memmove而不是memcpy,因为源和目标区域可能重叠

更通用的版本(处理多个不同子字符串)

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void removeMultipleSubstrings(char *str, char **subs, int num_subs) {
    for (int i = 0; i < num_subs; i++) {
        char *p = str;
        while ((p = strstr(p, subs[i])) != NULL) {
            memmove(p, p + strlen(subs[i]), strlen(p + strlen(subs[i])) + 1);
        }
    }
}
int main() {
    char str[] = "Remove bad words like 'foo', 'bar' and 'baz'";
    char *subs[] = {"foo", "bar", "baz"};
    int num_subs = sizeof(subs) / sizeof(subs[0]);
    printf("原始字符串: %s\n", str);
    removeMultipleSubstrings(str, subs, num_subs);
    printf("删除后的字符串: %s\n", str);
    return 0;
}

选择哪种方法取决于你的具体需求和性能考虑,方法一最简洁,方法二更灵活,方法三更直观。

c语言删除字符串中的指定字符串
(图片来源网络,侵删)
-- 展开阅读全文 --
头像
dede 给顶级栏目加子栏目
« 上一篇 01-21
织梦文件夹图片如何调用?
下一篇 » 01-21

相关文章

取消
微信二维码
支付宝二维码

目录[+]