为了账号安全,请及时绑定邮箱和手机立即绑定

在C中替换字符串的函数是什么?

在C中替换字符串的函数是什么?

C
一只萌萌小番薯 2019-07-11 21:15:00
在C中替换字符串的函数是什么?给定一个(char*)字符串,我希望找到一个子字符串的所有匹配项,并将其替换为一个备用字符串。我没有看到任何简单的函数可以在<string.h>中实现这一点。
查看完整描述

3 回答

?
慕斯709654

TA贡献1840条经验 获得超5个赞

优化器应该消除大多数局部变量。tmp指针的存在是为了确保strcpy不必遍历字符串才能找到空值。TMP指向每次呼叫后的结果结束。(见画家的算法为什么strcpy会很烦人。)

// You must free the result if result is non-NULL.char *str_replace(char *orig, char *rep, char *with) {
    char *result; // the return string
    char *ins;    // the next insert point
    char *tmp;    // varies
    int len_rep;  // length of rep (the string to remove)
    int len_with; // length of with (the string to replace rep with)
    int len_front; // distance between rep and end of last rep
    int count;    // number of replacements

    // sanity checks and initialization
    if (!orig || !rep)
        return NULL;
    len_rep = strlen(rep);
    if (len_rep == 0)
        return NULL; // empty rep causes infinite loop during count
    if (!with)
        with = "";
    len_with = strlen(with);

    // count the number of replacements needed
    ins = orig;
    for (count = 0; tmp = strstr(ins, rep); ++count) {
        ins = tmp + len_rep;
    }

    tmp = result = malloc(strlen(orig) + (len_with - len_rep) * count + 1);

    if (!result)
        return NULL;

    // first time through the loop, all the variable are set correctly
    // from here on,
    //    tmp points to the end of the result string
    //    ins points to the next occurrence of rep in orig
    //    orig points to the remainder of orig after "end of rep"
    while (count--) {
        ins = strstr(orig, rep);
        len_front = ins - orig;
        tmp = strncpy(tmp, orig, len_front) + len_front;
        tmp = strcpy(tmp, with) + len_with;
        orig += len_front + len_rep; // move to next "end of rep"
    }
    strcpy(tmp, orig);
    return result;}


查看完整回答
反对 回复 2019-07-11
?
倚天杖

TA贡献1828条经验 获得超3个赞

这在标准C库中没有提供,因为只要给定一个char*,如果替换字符串的长度大于要替换的字符串,则不能增加分配给该字符串的内存。

您可以更容易地使用std:string来完成这一任务,但是即使在那里,也不会有单个函数为您完成此操作。


查看完整回答
反对 回复 2019-07-11
?
Qyouu

TA贡献1786条经验 获得超11个赞

由于C中的字符串不能动态增长,所以内部替换通常不起作用。因此,您需要为有足够空间进行替换的新字符串分配空间,然后将部分从原始字符串再加上替换复制到新字符串中。复制要使用的部件斯特恩.


查看完整回答
反对 回复 2019-07-11
  • 3 回答
  • 0 关注
  • 1826 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信