2011-03-11 30 views
0

我想到目前爲止,我已經得到了一些代碼,試圖對其進行解碼解碼HTML實體(格式')的C.如何在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)); 
} 

我不知道如果主語句是正確的,因爲我做到了這個例子是我的程序從Web URL生成它,但這個想法是一樣的。

該函數替換&#39;用撇號,但輸出在最後,只是更換後是亂碼。

有沒有人有解決方案?

+0

我認爲這是因爲您要用1個字符替換5個字符,您正在將尾隨字符移動到正確的位置,但您需要通過刪除的字符數來縮短字符串。 (刪除最後的那些) – 2011-03-11 11:15:24

+0

我期望 - 但這不是發生了什麼.. 例如的 「HelloWorld '的母公司已經改變 - COMF」 變成了 「HelloWorld的parcompanypany已經改變 - COMF」 ??? – 2011-03-11 11:20:12

+0

在主'&字符串'是'char **'; convertHtmlEntities()函數需要一個'char *'。你不應該使用'&':'printf(「%s」,convertHtmlEntities(string));'沒問題。 – pmg 2011-03-11 11:55:07

回答

1

strncpy(或strcpy)不重疊字符串的工作。

你的字符串str+i+1str+i+5重疊。不要這樣做!

更換strncpymemmove

  *(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

我曾與代碼中的另一個問題 - 它切,最後 'F' 字。我換成這一行:

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

與此:

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

我相信那是因爲你刪除5個字符,並添加一個,因此新長不老-5,但老-4。

+0

我沒注意那些小細節;我認爲你有他們的權利:) – pmg 2011-03-11 12:06:25

+0

這是唯一的問題與我的機器上的代碼:) – 2011-03-11 12:24:42