0

我不是 C++ 专家,我正在编写一个程序来读取 html 文件的单行上的多个 URL,所以我编写了以下代码:

ifstream bf;
short chapters=0;
string blkhtml;
string blktmpfile; //given
string urldown;    //given
size_t found = 0, limit;

    while(getline(bf, blkhtml)){
            while((blkhtml.find(urldown, found) != string::npos) == 1){
                found = blkhtml.find(urldown);
                limit = blkhtml.find("\"", found);
                found=limit + 1;
                chapters++;
            }
    }

我的问题是 found 没有更新以在while条件下使用。正如我所见,除非另一个 std::string 类(对于字符串,str.erase() 更新它的值,但 (str.at() = '') 没有更新,否则不会更新 std::string 类),如果我想在每次循环开始时更新“找到”,并且对于条件,我可以在这里做什么。

我想做的是:

  • urldown检查给定字符串是否存在重合表达式。

  • 设置它的第一个和最后一个字符。

  • 在找到 url 之后的循环中更新 'pos',然后寻找下一个。

我已经查看了 cplusplus.com 和 cppreference.com 的所有内容,但没有找到对我有帮助的东西。

我考虑过 std::list::remove 在每个数字从 0 到 9 的循环上,然后给它一个新值,但我不知道它是否是最佳选择。

4

1 回答 1

1

问题是您每次都从头开始搜索:

while((blkhtml.find(urldown, found) != string::npos) == 1){
    found = blkhtml.find(urldown); // Searches from beginning of the string

这应该是:

while((blkhtml.find(urldown, found) != string::npos) == 1){
    found = blkhtml.find(urldown, found); // Searches from "found"

或者,只搜索一次,您可以将其放在while子句中:

while((found = blkhtml.find(urldown, found)) != string::npos){

此外,您不会在found每次读取新行时重置:

while(getline(bf, blkhtml)){
    found = 0;
于 2015-05-07T02:24:15.447 回答