Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C中转义html实体?_Html_C_String_Escaping_Entities - Fatal编程技术网

如何在C中转义html实体?

如何在C中转义html实体?,html,c,string,escaping,entities,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 = mall

我正在尝试用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));
}
#包括
#包括
#包括
char*convertHtmlEntities(char*str){
长度=strlen(str);
尺寸i;
char*endchar=malloc(sizeof(char));
长字符码;
如果(!endchar){
fprintf(stderr,“内存不足”);
退出(退出失败);
}
for(i=0;i='0'&&*(str+i+2)='0'&&*(str+i+3)
strncpy
(或
strcpy
)不适用于重叠字符串

您的字符串
str+i+1
str+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 */

我对代码有另一个问题-它剪切了最后一个“F”字符。我替换了这一行:

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

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

我相信这是因为您删除了五个字符并添加了一个字符,所以新的长度不是old-5,而是old-4。

我认为这是因为您将5个字符替换为1个字符,您将尾随字符移动到正确的位置,但您需要将字符串缩短已删除的字符数。(最后删除这些字符)我希望-但事实并非如此..例如,“Helloworld';的母公司已更改-comF”变为“Helloworld的公司已更改-comF”?在main
&string
中是一个
char**
;convertHtmlEntities()函数需要一个
char*
。您不应该使用
&
printf(%s),convertHtmlEntities(string));
可以。顺便说一句,您不必为
endchar
调用malloc内存,因为
strtol
将更新指向传入第一个参数的字符串内点的指针。您只需执行
char*endchar=NULL;long charCode=strtol(str+i+2,&endchar,0)
,否则您正在泄漏内存。@Adam,@Sylvain:由于未使用
endchar
,因此最好不要声明它,并在strtol中使用
NULL
:strtol(str+i+2,NULL,10)
我没有注意这些小细节;我认为您是对的:)