从用C解析的文件中删除标记

从用C解析的文件中删除标记,c,parsing,text,C,Parsing,Text,我想使用C打印文本文件中标记之间的数据 输入语句: <PERSON> Mark Zuckerberg </PERSON> is a entrepreneur from <LOCATION> USA </LOCATION>. He is also the CEO of <ORGANIZATION> Facebook </ORGANIZATION>. 我的输出是: Mark Zuckerberg </PERSON US

我想使用C打印文本文件中标记之间的数据

输入语句:

<PERSON> Mark Zuckerberg </PERSON> is a entrepreneur from <LOCATION> USA </LOCATION>. He is also the CEO of <ORGANIZATION> Facebook </ORGANIZATION>.
我的输出是:

Mark Zuckerberg </PERSON

USA </LOCATION

Facebook </ORGANIZATION
马克·扎克伯格
#包括
#包括
#包括
char*getfield(char**sp){
char*left;//指向<
char*right;//指向>
如果((左=strchr(*sp',)==NULL)
返回NULL;
size\u t len=right-left;//如果len=1,则标记为nothing()
char*tag=malloc(len);
memcpy(标签,左+1,透镜-1);
标签[len-1]='\0';
char*etag=malloc(len+3);
sprintf(etag,“,tag);
左=右+1;
if((right=strstr(left,etag))==NULL)//右点到端点标记
{
免费(标签);
免费(etag);
返回NULL;
}
len=右-左;
char*text=malloc(len+1);
memcpy(文本,左侧,len);
文本[len]='\0';
*sp=右+斯特伦(etag);
免费(标签);
免费(etag);
返回文本;
}
内部主(空){
字符行[500000];
而(fgets(生产线、生产线尺寸、标准尺寸)){
char*arg=行;
字符*文本;
while((text=getfield(&arg))!=NULL){
printf(“%s\n”,文本);
免费(文本);
}
}
返回0;
}

这完全是一个复制品。(好的,代码已更改,但问题和海报可能是相同的。)是的。我在这方面仍然有问题。你已经得到了详细和有用的答案,解释了你代码的缺点和误解。研究它们。所以,这不是反复问同一个问题,直到你得到一个你喜欢的答案?在C语言中操纵字符串总是非常痛苦的;如果它不是必需的,我建议使用sed。我是编程新手。因此,非常感谢您的帮助。我已经根据建议更改了代码并进行了修改。我感谢那些指导我的助手。我只是想知道我哪里出错了,什么是正确的代码。这是基于各种假设谢谢你这个蓝精灵。非常感谢。
Mark Zuckerberg </PERSON

USA </LOCATION

Facebook </ORGANIZATION
#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;
}