You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C语言中将字符串中的指定子串替换为指定字符进行脱敏

实现C语言redact函数:将指定子串替换为等长重复字符

需求说明

实现名为redact的函数,将目标字符串中的特定子串替换为与子串等长度的指定字符。例如把"Hello password"里的"password"替换为'*',结果为"Hello ********"。

示例用法

#include <stdio.h>

int main()
{
    char s[] = "Hello password";
    printf("Input:\t\"%s\"\n", s);
    redact(s, "password", '*');
    printf("Output:\t\"%s\"\n", s);
}

预期执行结果

Input: "Hello password"
Output: "Hello ********"

高效实现方案

针对本场景(替换后字符串总长度不变),无需额外分配内存,直接在原字符串上修改即可,比通用替换方案效率更高。

#include <string.h>

void redact(char *str, const char *substr, char replace_char) {
    // 空指针或空子串直接返回,避免无效操作
    if (!str || !substr || *substr == '\0') {
        return;
    }

    const size_t substr_len = strlen(substr);
    char *match_pos = str;

    // 循环查找所有子串匹配项
    while ((match_pos = strstr(match_pos, substr)) != NULL) {
        // 将匹配到的子串替换为指定字符
        memset(match_pos, replace_char, substr_len);
        // 移动指针到当前匹配项末尾,防止重复替换同一位置
        match_pos += substr_len;
    }
}

代码说明

  1. 参数校验:先判断输入的字符串、子串是否合法,空指针或空子串直接退出函数。
  2. 子串长度获取:通过strlen得到子串长度,确定需要替换的字符数量。
  3. 查找与替换:用strstr逐个查找子串,找到后用memset批量替换字符,之后移动指针到匹配项末尾,继续查找下一个匹配位置,避免重复处理同一区域。

补充说明

部分通用字符串替换方案支持替换串与原串长度不同的场景,这类方案需要额外分配内存存储结果,但对于本场景来说,直接修改原字符串的方式更高效,无额外内存开销。

内容的提问来源于stack exchange,提问作者Felipe G. Nievinski

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 15:03:28