如何在C中转义html实体?

时间:2011-03-11 11:06:19

标签: html c string escaping entities

我正在尝试解码C中的HTML实体(格式为')。

到目前为止,我已经有了一些代码来尝试解码它们,但它似乎产生奇数输出。

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

char* convertHtmlEntities(char* str) {
    size_t length = strlen(str);
    size_t i;
    char *endchar = malloc(sizeof(char));
    long charCode;
    if (!endchar) {
        fprintf(stderr,"not enough memory");
        exit(EXIT_FAILURE);
    }
    for (i=0;i<length;i++) {
        if (*(str+i) == '&' && *(str+i+1) == '#' && *(str+i+2) >= '0' && *(str+i+2) <= '9' && *(str+i+3) >= '0' && *(str+i+3) <= '9' && *(str+i+4) == ';') {
            charCode = strtol(str+i+2,&endchar,0);
            printf("ascii %li\n",charCode);
            *(str+i) = charCode;
            strncpy(str+i+1,str+i+5,length - (i+5));
            *(str + length - 5) = 0; /* null terminate string */
        }
    }
    return str;
}

int main()
{
    char string[] = "Helloworld&#39;s parent company has changed - comF";
    printf("%s",convertHtmlEntities(&string));
}

我不确定主要陈述是否正确,因为我刚刚为这个例子做了,因为我的程序是从网址生成的,但是想法是一样的。

该函数确实用撇号替换&#39;,但输出在结束时和更换后都是乱码。

有没有人有解决方案?

2 个答案:

答案 0 :(得分:1)

strncpy(或strcpy)不适用于重叠字符串。

您的字符串str+i+1str+i+5重叠。不要那样做!

strncpy替换为memmove

            *(str+i) = charCode;
            memmove(str+i+1,str+i+5,length - (i+5) + 1); /* also copy the '\0' */
            /* strncpy(str+i+1,str+i+5,length - (i+5)); */
            /* *(str + length - 5) = 0; */ /* null terminate string */

答案 1 :(得分:0)

我的代码有另一个问题 - 它会删除最后一个'F'字符。我替换了这一行:

 *(str + length - 5) = 0; /* null terminate string */

用这个:

 *(str + length - 4) = 0; /* null terminate string */

我相信它是因为你删除了5个字符并添加了一个,所以新的长度不是旧的5,而是旧的4。