1、简单替换第一个出现的子串
使用 strstr
定位第一次出现的子串,用 strncpy
和 strcat
拼接替换后的新字符串,避免直接在原字符串中操作,降低风险。
#include <stdio.h>
#include <string.h>
void str_replace_once(char *buffer, const char *oldWord, const char *newWord) {
char temp[1024];
char *pos = strstr(buffer, oldWord);
if (pos == NULL) return; // 没找到不替换
// 复制 oldWord 之前的部分
int len_before = pos - buffer;
strncpy(temp, buffer, len_before);
temp[len_before] = '\0';
// 拼接 newWord
strcat(temp, newWord);
// 拼接 oldWord 之后的部分
strcat(temp, pos + strlen(oldWord));
// 把结果复制回原 buffer
strcpy(buffer, temp);
}
int main() {
char str[1024] = "I love programming in C";
str_replace_once(str, "C", "C++");
printf("%s\n", str); // 输出:I love programming in C++
return 0;
}
2、全部替换
使用 strstr
找位置,简单有效。处理多个匹配(循环查找)。替换后更新 buffer
。
#include <stdio.h>
#include <string.h>
// str_replace_all 函数
void str_replace_all(char *buffer, const char *oldWord, const char *newWord) {
char temp[1024];
char *pos;
int oldLen = strlen(oldWord);
int newLen = strlen(newWord);
while ((pos = strstr(buffer, oldWord)) != NULL) {
// 清空 temp
temp[0] = '\0';
// 复制 oldWord 之前的部分
int len_before = pos - buffer;
strncpy(temp, buffer, len_before);
temp[len_before] = '\0';
// 拼接 newWord
strcat(temp, newWord);
// 拼接 oldWord 之后的部分
strcat(temp, pos + oldLen);
// 更新 buffer
strcpy(buffer, temp);
}
}
int main() {
char text[1024] = "Hello world! Welcome to the world of C programming.";
const char *oldWord = "world";
const char *newWord = "universe";
printf("原字符串: %s\n", text);
// 调用替换函数
str_replace_all(text, oldWord, newWord);
printf("替换后: %s\n", text);
return 0;
}
3、使用 POSIX 正则库替换字符串中的内容
使用 正则表达式库(POSIX regex) 进行字符串替换,可以使用 库配合字符串处理来实现。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <regex.h>
void regex_replace(const char *src, const char *pattern, const char *replacement, char *result, size_t result_size) {
regex_t regex;
regmatch_t pmatch[1];
const char *cursor = src;
char temp[1024];
result[0] = '\0'; // 清空结果
if (regcomp(®ex, pattern, REG_EXTENDED) != 0) {
printf("正则编译失败\n");
return;
}
while (regexec(®ex, cursor, 1, pmatch, 0) == 0) {
// 拷贝匹配前的内容
strncat(result, cursor, pmatch[0].rm_so);
// 拼接替换内容
strncat(result, replacement, result_size - strlen(result) - 1);
// 移动 cursor
cursor += pmatch[0].rm_eo;
}
// 拼接剩余未匹配的部分
strncat(result, cursor, result_size - strlen(result) - 1);
regfree(®ex);
}
int main() {
const char *text = "hello 123 world 456";
const char *pattern = "[0-9]+"; // 匹配数字
const char *replacement = "***"; // 替换为 ***
char result[1024];
regex_replace(text, pattern, replacement, result, sizeof(result));
printf("原文: %s\n", text);
printf("替换后: %s\n", result);
return 0;
}