我想通过标记分隔符将html页面拆分为多个部分:例如<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之外,我还能使用其他方法吗?
答案 0 :(得分: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);
会因为没有分配给指针的内存而崩溃。
答案 1 :(得分: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");
答案 2 :(得分:0)
strtok
的第二个参数是分隔符字符列表。其中每个都将用于将字符串拆分为标记。我认为它不会像你认为的那样......
如果您想将html文件解析为令牌,可以查看lex
...
您想要的输出是多少?你有输入的测试用例吗?
您的代码应该生成以下内容:
<强>输入强>
<html><img src="test.png"/></html>
<强>输出:强>
我不知道那是你想要的......