在字符串中搜索和替换

时间:2014-11-08 12:14:53

标签: c string replace html-entities

如何在C中搜索和替换?我正在尝试用函数替换字符串中的html实体。我已经有了查找html实体开头和结尾的功能,但我无法弄清楚如何替换它们。

这是我已经拥有的:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct entity {
    char *entity;
    char *substitute;
};

void replacehtmlentities(char *str, char *dest) {
    int i;
    char *begin = NULL;
    char *end;

    struct entity entities[] = {
        { "&nbsp;", " " },
        { "&lt;", "<" },
        { "&gt;", ">" },
        { "&amp;", "&" },
        { "&euro;", "€" },
        { "&copy;", "©" },
        { "&reg;", "®" },
        { NULL, NULL },
    };

    for (i = 0; entities[i].entity; i++) {
        while (begin = strstr(str, entities[i].entity)) {
            end = begin + strlen(entities[i].entity);
            // how to replace
        }
    }
}

int main(int argc, char **argv) {
    char *str = "space &nbsp; lowerthan &lt; end";

    printf("%s\n", str);

    replacehtmlentities(str);

    printf("%s\n", str);

    return EXIT_SUCCESS;
}

2 个答案:

答案 0 :(得分:2)

指针str指向字符串文字,字符串文字只读(即常量)。尝试修改字符串文字将导致undefined behavior

解决方案非常简单:将str声明为数组:

char str[] = "space &nbsp; lowerthan &lt; end";

但是在替换字符串中的序列时要小心,所以不要用较长的子字符串替换较短的子字符串,因为这样你可能会超出字符串的末尾。

答案 1 :(得分:2)

简短的回答是使用现有的字符串替换功能。我的网站http://creativeandcritical.net/str-replace-c/上有一个(当前版本名为replace_str2)。您需要对代码进行的更改(测试)是:

  • #include <stddef.h>添加到其他包含。
  • replace_str2功能复制到replacehtmlentities功能上方的文件中。
  • 将函数replacehtmlentities的原型更改为:

    char *replacehtmlentities(char *str)
    
  • 向该函数添加以下变量声明:

    char *tmp = NULL;
    char *tmp2 = str;
    
  • 在该函数中替换代码:

        while (begin = strstr(str, entities[i].entity)) {
            end = begin + strlen(entities[i].entity);
            // how to replace
        }
    

使用:

        tmp = replace_str2(tmp2, entities[i].entity, entities[i].substitute);
        if (i) free(tmp2);
        tmp2 = tmp;
  • 为该函数添加最终返回值:

    return tmp2;
    
  • 在main中,将您对该函数的调用更改为:

    str = replacehtmlentities(str);
    

作为补充说明:在main中,str现在将引用分配有malloc的内存。如果/当您不再需要此字符串时,可以通过调用free(str)来释放内存。