c - 从用 C 解析的文件中删除标签

标签 c parsing text

我想使用 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并仅获取 Mark Zuckerberg USA Facebook 作为输出。我需要在哪里更改代码?

最佳答案

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

关于c - 从用 C 解析的文件中删除标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33538909/

相关文章:

c - 在c中使用结构体数组时出现段错误11

java - 将字符串转换为日期

java - 从 java 文件中提取完整的属性类型

mysql - RMySQL、dbWriteTable 和包含换行符的文本字段

c - 为什么我会出现段错误 [139]?

javascript - 使用 JS-ctypes 将结构化数据传递给 native 代码

c - 将十六进制数字映射到连续整数 : GCC's switch works 1. 比我手写的 SSE2 内在函数 cmpeq/movemask/bsf 快 5 倍?

java - 使用 XML 文档 Java 的属性创建类的实例

php - 从文本文件中读取数据 PHP

javascript - HTML内容显示有限行