使用 strstr 查找子字符串的所有实例导致奇怪的字符串格式
Using strstr to find all instances of substring results in weird string formatting
我正在制作网络抓取工具,现在我需要解析传入的数据。一切都很顺利,直到我不得不在一个字符串中找到一个子字符串的所有实例。我能够得到一些工作,但它没有给我我想要的完整字符串(这是一个完整的 <p></p>
标签)。
done = 0;
while (done == 0) {
if ((findSpan = strstr(serverResp, "<p")) != NULL) {
printf("%s\n", findSpan);
if ((findSpanEnd = strstr(findSpan, "</p>")) != NULL) {
strcpy(serverResp, findSpanEnd);
strcpy(findSpanEnd+4, "");
printf("after end tag formattng %s\n", findSpan);
}
} else {
done = 1;
}
}
结束标记格式化后应该给我一个类似于 <p>insert text here</p>
的结果,但相反,我得到这样的结果:
<p>This should be printed</p>
<h3>ignore</h3>
<p>and so should this</p>
</body>
</html>
after end tag formatting <p>This should be printed</p>
<h3>ignore</h3>
<p>and so should this</p>
</body>
</html>
after end tag formatting dy>
</html>
该站点的代码如下所示:
<!DOCTYPE html>
<html>
<head></head>
<body>
<h1>ignore this</h1>
<p>This should be printed</p>
<h3>ignore</h3>
<p>and so should this</p>
</body>
</html>
if ((findSpanEnd = strstr(findSpan, "</p>")) != NULL) {
strcpy(serverResp, findSpanEnd);
这毫无意义。 strstr
按要求找到 "</p>"
;但是你不能像那样将它传递给 strcpy
。 strstr
根本不分配新字符串;它只是 return 旧位置中的位置。
打印所有 <p>
标签的例程如下所示(请注意,这假定没有嵌套 <p>
标签):
for (char *ptr = serverResp; ptr = strstr(ptr, "<p");)
{
char *finger = strchr(ptr, '>');
if (!finger) break;
++finger;
ptr = strstr(finger, "</p>");
if (!ptr) {
fwrite(finger, 1, strlen(finger), stdout);
} else {
fwrite(finger, 1, ptr - finger, stdout);
}
fputs("\r\n", stdout);
}
技巧:在 for 循环中调用 strstr
定位下一个 <p>
标记,strchr
找到它的结尾,然后另一个 strstr
找到关闭 </p>
因为 return 指针指向原始字符串,所以我们使用 fwrite
而不是 printf
来生成输出。
我正在制作网络抓取工具,现在我需要解析传入的数据。一切都很顺利,直到我不得不在一个字符串中找到一个子字符串的所有实例。我能够得到一些工作,但它没有给我我想要的完整字符串(这是一个完整的 <p></p>
标签)。
done = 0;
while (done == 0) {
if ((findSpan = strstr(serverResp, "<p")) != NULL) {
printf("%s\n", findSpan);
if ((findSpanEnd = strstr(findSpan, "</p>")) != NULL) {
strcpy(serverResp, findSpanEnd);
strcpy(findSpanEnd+4, "");
printf("after end tag formattng %s\n", findSpan);
}
} else {
done = 1;
}
}
结束标记格式化后应该给我一个类似于 <p>insert text here</p>
的结果,但相反,我得到这样的结果:
<p>This should be printed</p>
<h3>ignore</h3>
<p>and so should this</p>
</body>
</html>
after end tag formatting <p>This should be printed</p>
<h3>ignore</h3>
<p>and so should this</p>
</body>
</html>
after end tag formatting dy>
</html>
该站点的代码如下所示:
<!DOCTYPE html>
<html>
<head></head>
<body>
<h1>ignore this</h1>
<p>This should be printed</p>
<h3>ignore</h3>
<p>and so should this</p>
</body>
</html>
if ((findSpanEnd = strstr(findSpan, "</p>")) != NULL) {
strcpy(serverResp, findSpanEnd);
这毫无意义。 strstr
按要求找到 "</p>"
;但是你不能像那样将它传递给 strcpy
。 strstr
根本不分配新字符串;它只是 return 旧位置中的位置。
打印所有 <p>
标签的例程如下所示(请注意,这假定没有嵌套 <p>
标签):
for (char *ptr = serverResp; ptr = strstr(ptr, "<p");)
{
char *finger = strchr(ptr, '>');
if (!finger) break;
++finger;
ptr = strstr(finger, "</p>");
if (!ptr) {
fwrite(finger, 1, strlen(finger), stdout);
} else {
fwrite(finger, 1, ptr - finger, stdout);
}
fputs("\r\n", stdout);
}
技巧:在 for 循环中调用 strstr
定位下一个 <p>
标记,strchr
找到它的结尾,然后另一个 strstr
找到关闭 </p>
因为 return 指针指向原始字符串,所以我们使用 fwrite
而不是 printf
来生成输出。