从文件中删除标签用C
问题描述:
解析我想利用C.从文件中删除标签用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
并获得唯一马克·扎克伯格的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;
}
+0
这是基于各种假设 – BLUEPIXY
+0
谢谢你BLUEPIXY。高度赞赏。 –
这是[如何解析C中的文本文件中的标签之间的数据]的确切克隆(http://*.com/questions/33523405/how-to-parse-data-between-tags-从-一个文本文件,在-C)。 (好的,代码已经改变了,但问题可能和海报相同。) –
是的。我在这方面仍然有问题。 –
你已经得到了详细和有用的答案,解释你的代码的缺点和误解。研究它们。所以,在你得到你喜欢的答案之前,这不是反复询问同一个问题。 –