如何在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[] = {
{ " ", " " },
{ "<", "<" },
{ ">", ">" },
{ "&", "&" },
{ "€", "€" },
{ "©", "©" },
{ "®", "®" },
{ 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 lowerthan < end";
printf("%s\n", str);
replacehtmlentities(str);
printf("%s\n", str);
return EXIT_SUCCESS;
}
答案 0 :(得分:2)
指针str
指向字符串文字,字符串文字只读(即常量)。尝试修改字符串文字将导致undefined behavior。
解决方案非常简单:将str
声明为数组:
char str[] = "space lowerthan < 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)来释放内存。