2015-11-05 193 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。高度赞赏。 –