簡體   English   中英

使用 strstr 查找 substring 的所有實例導致奇怪的字符串格式

[英]Using strstr to find all instances of substring results in weird string formatting

我正在制作一個 web 刮板,我正處於需要解析傳入數據的位置。 一切都很順利,直到我不得不在字符串中找到 substring 的所有實例。 我能夠得到一些工作,但它沒有給我我想要的完整字符串(這是一個完整的<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根本不分配新字符串; 它只返回舊位置中的位置。

打印出所有<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>因為返回指針指向原始字符串,所以我們改用fwrite printf生成 output。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM