从用C解析的文件删除标签 [英] Removing Tags from a file parsed in C

查看:108
本文介绍了从用C解析的文件删除标签的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想用C从文本文件打印标签之间的数据。

输入的语句:

 <&PERSON GT;马克·扎克伯格< /人>从℃的恩特雷里奥斯preneur;地点>美国< /地点&gt ;.他也是LT的&首席执行官;组织> Facebook和LT; /组织取代。

输出:马克·扎克伯格的Facebook美国

我的计划code是:

 为const char * getfield命令(字符*线,INT NUM)
{
    为const char * TOK;
    对于(TOK = strtok的(行,/>中);
        TOK&功放;&安培; * TOK;
        托克= strtok的(NULL,>中))
    {
        如果(! - NUM)
            返回TOK;
    }
    返回NULL;
}诠释的main()
{
    焦线[500000]。
    而(与fgets(行,500000标准输入))
    {
        字符* ARG =行;
        为const char * TOK;
        而((TOK = getfield命令(阿根廷,2))!= NULL){
            的printf(%S \\ n,TOK);
            精氨酸= NULL;
        }
    }
}

我的输出是:

 马克·扎克伯格< /人美国< /位置Facebook和LT; /组织

我想摆脱&LT的; /标签并获得唯一的马克·扎克伯格的Facebook美国作为输出。我在哪里需要更改code?


解决方案

 的#include<&stdio.h中GT;
#包括LT&;&stdlib.h中GT;
#包括LT&;&string.h中GT;字符* getfield命令(字符** SP){
    字符*左; //点​​到<
    字符*权; //点到>    如果((左=和strchr(* SP,'<'))== NULL)
        返回NULL;
    如果((右=和strchr(左,'>'))== NULL)
        返回NULL;    为size_t的len =右 - 左; //如果len == 1,标签是什么(LT;>)
    字符*标签=的malloc(LEN);
    的memcpy(标签,左+ 1,-1的len);
    标签[LEN-1] ='\\ 0';    字符* ETAG =的malloc(LEN + 3);
    sprintf的(ETAG,< /%S>中,标签);
    左=右+ 1;
    如果((右=的strstr(左,ETAG))== NULL)//右键点结束标记
    {
        免费(标签);
        免费(ETAG);
        返回NULL;
    }
    LEN =右 - 左;
    字符*文字=的malloc(LEN + 1);
    的memcpy(文字,左,LEN);
    文[LEN] ='\\ 0';    * SP =右+的strlen(ETAG);
    免费(标签);
    免费(ETAG);
    返回文本;
}诠释主要(无效){
    焦线[500000]。    而(与fgets(行,sizeof的线路,标准输入)){
        字符* ARG =行;
        字符*文本;        而((文= getfield命令(安培;!ARG))= NULL){
            的printf(%S \\ n,文本);
            免费(文本);
        }
    }
    返回0;
}

I want to print the data between tags from a text file using C.

Input statement :

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

Output: Mark Zuckerberg USA Facebook.

My Program code is :

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

My output is :

Mark Zuckerberg </PERSON

USA </LOCATION

Facebook </ORGANIZATION

I want to get rid of </Tag and get only Mark Zuckerberg USA Facebook as output. Where do I need to change the code?

解决方案

#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解析的文件删除标签的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆