0

我想通过标签分隔符将 html 页面拆分为多个部分:like<img<div>. 我尝试了以下代码,但它不起作用:

char source[MAXBUFLEN + 1];
FILE *fp = fopen("source.html", "r");
if (fp != NULL)
{
    size_t newLen = fread(source, sizeof(char), MAXBUFLEN, fp);
    if (newLen == 0) {
        fputs("Error reading file", stderr);
    } else {
        source[++newLen] = '\0'; /* Just to be safe. */
    }
}
fclose(fp);

//not working
char* strArray[10];
int i = 0;
char *token = strtok(source, "<img");
while(token != NULL)
{
    strcpy(strArray[i++], token);

    token = strtok(NULL, "<img");
}

printf("%s\n", strArray[3]);

我究竟做错了什么?除了strtok,我还能使用其他方法吗?

4

3 回答 3

2
char *strtokByWord_r(char *str, const char *word, char **store){
    char *p, *ret;
    if(str != NULL){
        *store = str;
    }
    if(*store == NULL) return NULL;
    p = strstr(ret=*store, word);
    if(p){
        *p='\0';
        *store = p + strlen(word);
    } else {
        *store = NULL;
    }
    return ret;
}
char *strtokByWord(char *str, const char *word){
    static char *store = NULL;
    return strtokByWord_r(str, word, &store);
}

代替

char *token = strtok(source, "<img");
...
token = strtok(NULL, "<img");

char *token = strtokByWord(source, "<img");
...
token = strtokByWord(NULL, "<img");
于 2013-07-30T10:32:47.963 回答
2

正如达人已经发布的那样,strtok()不做你想做的事。您可以使用

char *ptr = strstr( source, "<img" );

而是找到第一个标签,然后

ptr = strstr(ptr+4, "<img" ); // search starts direcly behind the previous "<img" 
                              // maybe you can find a better offset

为接下来的事件。

此外,你的线

strcpy(strArray[i++], token);

会崩溃,因为您没有分配给指针的内存。

于 2013-07-30T09:26:07.710 回答
0

to 的第二个参数strtok是分隔符列表。这些中的每一个都将用于将字符串拆分为标记。我不认为它会像你想象的那样做......

如果您想将 html 文件解析为令牌,您可以查看lex...

你想要的输出是什么?你有输入的测试用例吗?

您的代码应生成以下内容:

输入:

<html><img src="test.png"/></html>

输出:

  • “”
  • “H T”
  • "l>"
  • " src=\"test.pn"
  • "\"/>"
  • “/H T”
  • "l>"

我不认为这是你想要的......

于 2013-07-30T09:21:55.943 回答