从用C解析的文件删除标签 [英] Removing Tags from a file parsed in C
本文介绍了从用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屋!
查看全文