gpt4 book ai didi

c++ - 在 while 循环和段错误 C++ 中使用 erase()

转载 作者:行者123 更新时间:2023-11-28 06:26:35 25 4
gpt4 key购买 nike

好的,所以我在这里遇到了一点问题。问题是这段代码可以在 friend 的计算机上运行,​​但是当我尝试运行它时出现段错误。

我正在读取一个如下所示的文件:

word 2 wor ord
anotherword 7 ano oth the her erw wor ord
...

而且我想解析文件中的每个单词。前两个单词(例如单词和 2)将被删除,但将第一个单词保存在过程中的另一个变量中。

我仔细研究了一下如何实现这一点,然后我想出了这段半途而废的代码,它似乎可以在我 friend 的计算机上运行,​​但不能在我的计算机上运行。

Dictionary::Dictionary() {
ifstream ip;
ip.open("words.txt", ifstream::in);
string input;
string buf;
vector<string> tokens; // Holds words
while(getline(ip, input)){
if(input != " ") {
stringstream ss(input);
while(ss >> buf) {
tokens.push_back(buf);
}
string werd = tokens.at(0);
tokens.erase(tokens.begin()); // Remove the word from the vector
tokens.erase(tokens.begin()); // Remove the number indicating trigrams
Word curr(werd, tokens);
words[werd.length()].push_back(curr); // Put the word at the vector with word length i.
tokens.clear();
}
}
ip.close();
}

解析文件中的这种结构并删除前两个元素但保存其他元素的最佳做法是什么?如您所见,我正在创建一个 Word 对象,其中包含一个字符串和一个 vector 供以后使用。

问候

编辑;它似乎可以很好地添加第一行,但是在删除第二个元素时,它会因段错误而崩溃。

编辑; words.txt 包含这个:

addict 4 add ddi dic ict 
sinister 6 ini ist nis sin ste ter
test 2 est tes
cplusplus 7 cpl lus lus plu plu spl usp

没有前导空格或结尾空格。并不是说它一直在读。

Word.cc:

#include <string>
#include <vector>
#include <algorithm>
#include "word.h"

using namespace std;

Word::Word(const string& w, const vector<string>& t) : word(w), trigrams(t) {}

string Word::get_word() const {
return word;
}

unsigned int Word::get_matches(const vector<string>& t) const {
vector<string> sharedTrigrams;
set_intersection(t.begin(),t.end(), trigrams.begin(), trigrams.end(), back_inserter(sharedTrigrams));
return sharedTrigrams.size();
}

最佳答案

首先,您发布的代码中关闭 } 的次数有误。如果你正确地缩进它们,你会看到你的代码是:

while(getline(ip, input))
{
if(input != " ")
{
stringstream ss(input);
while(ss >> buf) {
tokens.push_back(buf);
}
}
string werd = tokens.at(0);
tokens.erase(tokens.begin());
tokens.erase(tokens.begin());
Word curr(werd, tokens);
words[werd.length()].push_back(curr);
tokens.clear();
}
}

假设这是发布中的一个小错字,另一个问题是当 input == "" 但您继续使用 tokens 是一个空列表 token ,就好像它有 2 个或更多项目一样。

您可以通过将所有内容移动到 if 语句中来解决这个问题。

while(getline(ip, input))
{
if(input != " ")
{
stringstream ss(input);
while(ss >> buf) {
tokens.push_back(buf);
}

string werd = tokens.at(0);
tokens.erase(tokens.begin());
tokens.erase(tokens.begin());
Word curr(werd, tokens);
words[werd.length()].push_back(curr);
tokens.clear();
}
}

我会添加进一步的检查以使其更健壮。

while(getline(ip, input))
{
if(input != " ")
{
stringstream ss(input);
while(ss >> buf) {
tokens.push_back(buf);
}

string werd;

if ( !tokens.empty() )
{
werd = tokens.at(0);
tokens.erase(tokens.begin());
}

if ( !tokens.empty() )
{
tokens.erase(tokens.begin());
}

Word curr(werd, tokens);
words[werd.length()].push_back(curr);
tokens.clear();
}
}

关于c++ - 在 while 循环和段错误 C++ 中使用 erase(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28420543/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com