Как избежать html сущностей в C? - PullRequest
0 голосов
/ 11 марта 2011

Я пытаюсь декодировать HTML-объекты (в формате ') в C.

Пока у меня есть некоторый код, чтобы попытаться декодировать их, но, похоже, он производит странный вывод.

#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));
}

Я не уверен, что основное утверждение верно, потому что я только что сделал это для этого примера, поскольку моя программа генерирует его из веб-URL, однако идея та же.

Функция заменяет &#39; апострофом, но вывод искажается в конце и сразу после замены.

У кого-нибудь есть решение?

Ответы [ 2 ]

1 голос
/ 11 марта 2011

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 */
0 голосов
/ 11 марта 2011

У меня была другая проблема с кодом - он вырезал последний символ «F». Я заменил эту строку:

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

с этим:

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

Я полагаю, это потому, что вы удаляете пять символов и добавляете один, поэтому новая длина не старая-5, а старая-4.

...