c++ - 为什么擦除命令会结束我的 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());
}
}
}
我想让这段代码在没有我不使用的擦除命令的情况下工作。
解决方案
text.find(deli))
是在你的字符串中找到一些东西,如果找到了,那text.find(deli)) != std::string::npos
就是真的。如果您再次使用 sametext
和 same调用它deli
,那么结果将是相同的。
在您的循环中,text.erase(0, pos + deli.length());
更改字符串text
。如果没有这部分,循环中的任何内容都不会更改text
或deli
。这就是它导致无限循环的原因:如果text.find(deli)) != std::string::npos
是true
第一次,它永远为真,没有什么可以阻止它,因为break
您的代码中也没有任何或任何其他类型的逻辑可以跳出循环。
推荐阅读
- javascript - 在 Promise 中抛出异常时未调用`window.onerror`钩子
- angular - 同步获取 rxjs 值,这是一种反模式吗?
- ios - Swift - 字典提取 API
- google-tag-manager - Google 跟踪代码管理器 (GTM) 是否处理在线标识符/cookie 标识符?
- python - 使用数组列表作为索引,遍历数组以从数据集中绘制 20 张图像时遇到问题
- json - 如何在 Ansible 中访问数组内的对象内的键/对值?
- c# - Signal R reconnect 似乎创建了一个新线程
- android - Firebase 提供 Task 而不是 Url
- c - 如何访问 ESP-IDF 应用程序代码中的编译时间?
- python - 如何输出到 txt(使用处理 3 在 Python 中编程)