从用C解析的文件中删除标记
我想使用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
<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;
}