首页 > 解决方案 > 为什么擦除命令会结束我的 while 循环?

问题描述

所以我有一段代码很好用。目标是过滤我的whatsapp - 聊天记录。我想要的第一件事是整理出只有以“Ben:...”开头的消息被整理出来,其余的被丢弃。

我成功了,但这只是因为我无法理解的一个奇怪的功能。由于一些较早的尝试,我的代码中有一个擦除命令,现在它没有真正的用途。然而,如果没有它,我的 while 循环会无限循环。

为什么擦除命令可以帮助我完成循环?

我尝试删除它,并尝试了其他想法。没有任何效果。

#include <iostream>
#include <string>
#include <fstream>

using namespace std;

int main(){
    string text;
    string deli = "Ben:";

    string token;
    size_t pos = 0;

    ifstream myfile;
    myfile.open("WAEZ.txt");

    while( getline(myfile, text)){
        while((pos = text.find(deli)) != std::string::npos){
            token = text.substr(pos,std::string::npos);
            cout << token << endl;
            text.erase(0, pos + deli.length());
        }
    }    
}

我想让这段代码在没有我不使用的擦除命令的情况下工作。

标签: c++while-loop

解决方案


text.find(deli))是在你的字符串中找到一些东西,如果找到了,那text.find(deli)) != std::string::npos就是真的。如果您再次使用 sametext和 same调用它deli,那么结果将是相同的。

在您的循环中,text.erase(0, pos + deli.length());更改字符串text。如果没有这部分,循环中的任何内容都不会更改textdeli。这就是它导致无限循环的原因:如果text.find(deli)) != std::string::npostrue第一次,它永远为真,没有什么可以阻止它,因为break您的代码中也没有任何或任何其他类型的逻辑可以跳出循环。


推荐阅读