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;
}
注意事项
- 这些方法都会修改原始字符串
- 如果子字符串为空,函数应该直接返回而不做任何操作
- 对于重叠的子字符串(如删除"aa"从"aaaa"中),这些方法都能正确处理
- 内存操作使用
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;
}
选择哪种方法取决于你的具体需求和性能考虑,方法一最简洁,方法二更灵活,方法三更直观。

(图片来源网络,侵删)
