2015-11-05 198 views
-3

解析我想利用C.從文件中刪除標籤用C

輸入聲明文本文件打印標籤之間的數據:

<PERSON> Mark Zuckerberg </PERSON> is a entrepreneur from <LOCATION> USA </LOCATION>. He is also the CEO of <ORGANIZATION> Facebook </ORGANIZATION>. 

輸出:馬克·扎克伯格Facebook的美國。

我的程序代碼是:

const char* getfield(char* line, int num) 
{ 
    const char* tok; 
    for (tok = strtok(line, "/>"); 
     tok && *tok; 
     tok = strtok(NULL, ">")) 
    { 
     if (!--num) 
      return tok; 
    } 
    return NULL; 
} 

int main() 
{ 
    char line[500000]; 
    while (fgets(line, 500000, stdin)) 
    { 
     char *arg = line; 
     const char *tok; 
     while ((tok = getfield(arg, 2)) != NULL) { 
      printf("%s\n", tok); 
      arg = NULL; 
     } 
    } 
} 

我的輸出是:

Mark Zuckerberg </PERSON 

USA </LOCATION 

Facebook </ORGANIZATION 

我想擺脫</Tag並獲得唯一馬克·扎克伯格的Facebook美國作爲輸出。我需要在哪裏更改代碼?

+6

這是[如何解析C中的文本文件中的標籤之間的數據]的確切克隆(http://stackoverflow.com/questions/33523405/how-to-parse-data-between-tags-從-一個文本文件,在-C)。 (好的,代碼已經改變了,但問題可能和海報相同。) –

+0

是的。我在這方面仍然有問題。 –

+4

你已經得到了詳細和有用的答案,解釋你的代碼的缺點和誤解。研究它們。所以,在你得到你喜歡的答案之前,這不是反覆詢問同一個問題。 –

回答

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

char *getfield(char **sp){ 
    char *left; //point to < 
    char *right;//point to > 

    if((left = strchr(*sp, '<')) == NULL) 
     return NULL; 
    if((right = strchr(left, '>')) == NULL) 
     return NULL; 

    size_t len = right - left;//if len == 1, tag is nothing(<>) 
    char *tag = malloc(len); 
    memcpy(tag, left + 1, len -1); 
    tag[len-1] = '\0'; 

    char *etag = malloc(len + 3); 
    sprintf(etag, "</%s>", tag); 
    left = right + 1; 
    if((right = strstr(left, etag)) == NULL)//right point to end tag 
    { 
     free(tag); 
     free(etag); 
     return NULL; 
    } 
    len = right - left; 
    char *text = malloc(len + 1); 
    memcpy(text, left, len); 
    text[len] = '\0'; 

    *sp = right + strlen(etag); 
    free(tag); 
    free(etag); 
    return text; 
} 

int main(void){ 
    char line[500000]; 

    while (fgets(line, sizeof line, stdin)){ 
     char *arg = line; 
     char *text; 

     while ((text = getfield(&arg)) != NULL){ 
      printf("%s\n", text); 
      free(text); 
     } 
    } 
    return 0; 
} 
+0

這是基於各種假設 – BLUEPIXY

+0

謝謝你BLUEPIXY。高度讚賞。 –