gpt4 book ai didi

c++ - String::erase 在与迭代器一起使用时抛出 length_error

转载 作者:行者123 更新时间:2023-11-27 23:13:01 26 4
gpt4 key购买 nike

stringstream str(line, ios_base::in);
while(!str.eof()){
string word;
str >> word;
std::transform(word.begin(), word.end(), word.begin(), ::tolower);
char c = *(--word.end());
char b = *word.begin();
if((c == ')' && b == '(') || (c == '\'' && b == '\'')){
word.erase(--word.end());
word.erase(word.begin()); //exception occurs here
}
c = *(--word.end());
if(c == ',' || c == '.' || c == '?' || c == '!')
word.erase(--word.end());
}

此代码在 word.erase(word.begin()) 处抛出一个 std::length_error (what(): basic_string::_S_create);但是,如果我将其更改为 word.erase(0, 1);它工作得很好。

这是为什么?

我正在使用 gcc 4.8.1(MinGW 构建)

最佳答案

如果由单个字符组成

'

然后

  • 条件 (c == '\'' && b == '\'') 将通过,所以我们将开始删除开始和结束字符,
  • word.erase(--word.end()); 将删除唯一的字符,使字符串为空,
  • 然后 word.erase(word.begin()); 会崩溃,因为 word.begin() 现在没有指向字符串。 (我认为它实际上会导致未定义的行为)

关于c++ - String::erase 在与迭代器一起使用时抛出 length_error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18815971/

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