【问题标题】:Removing Tags from a file parsed in C从用 C 解析的文件中删除标签
【发布时间】:2015-11-05 07:34:06
【问题描述】:

我想使用 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

我想摆脱 &lt;/Tag 并只获得 Mark Zuckerberg USA Facebook 作为输出。我需要在哪里更改代码?

【问题讨论】:

  • 这是How to parse data between tags from a text file in C 的精确克隆。 (好吧,代码变了,但问题和海报可能是一样的。)
  • 是的。我仍然有这个问题。
  • 你已经得到了关于这个问题的详细而有用的答案,解释了你的代码的缺点和误解。研究它们。 SO 不是重复问同一个问题,直到你得到你喜欢的答案。
  • 必须用 C 编写 id 吗?操作字符串是 C 总是很痛苦的;如果不需要,我建议使用 sed。
  • 我是编程新手。因此,感谢您的帮助。我已根据建议更改了代码并对其进行了修改。我感谢帮助我的帮助者。我只是想知道我哪里出错了,什么是正确的代码。

标签: c parsing text


【解决方案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;
}

【讨论】:

  • 这是基于各种假设
  • 谢谢 BLUEPIXY。高度赞赏。
猜你喜欢
  • 1970-01-01
  • 2011-04-04
  • 1970-01-01
  • 2011-08-20
  • 1970-01-01
  • 2021-04-26
  • 2021-06-05
  • 2021-10-12
  • 1970-01-01
相关资源
最近更新 更多