【问题标题】:Out of Range Error with for statementfor 语句超出范围错误
【发布时间】:2015-01-11 07:01:37
【问题描述】:

我正在尝试从字符串(类)的前面修剪空格。出于某种原因,每次我运行代码时都会收到一条错误消息,我不知道如何修复它。

void format_classes(string& classes)
{

  int n = classes.length();

  for (int i=0; i<n; i++)
  {
    if(classes[i] != ' ')
    {
        classes.erase(classes[0], classes[i]);
        break;
    }
  }     
}

上面的代码会收到" PhySiCS 101 lAB" 之类的东西,我必须在前面不带空格的情况下返回它。

我收到的错误信息是:

在抛出 'std::out_of_range' what(): basic_string::erase 的实例后调用终止

我对编码还是很陌生,所以也许是正确方向的提示而不是答案,这样我就可以从错误中吸取教训。

【问题讨论】:

    标签: c++ string void erase


    【解决方案1】:

    erase() 采用起始位置和长度。也就是数字。您在这些点传递字符。所以如果字符串是:

    "  foo"
    

    你基本上是在说:

    classes.erase(' ', 'f');
    

    classes.erase(32, 102);
    

    这肯定超出了您的 5 个字符的字符串范围。

    试试:

    classes.erase(0, i);
    

    【讨论】:

    • 谢谢!这正是问题所在。出于某种原因,我认为我必须在括号内指定哪个字符串。惊人的!祝您下午愉快!
    【解决方案2】:

    您的解决方案应该更像:

    int i(0);
    while((i < classes.length()) && (classes[i] == ' ')) ++i;
    classes.erase(0,i);
    

    @Paul Roub 已经很好地解释了它。

    【讨论】:

    • 是的,你们一针见血!这正是缺少的!谢谢!!
    • 不客气。如果我的回答有帮助,请考虑投票(我知道保罗回答了实际问题,我只提供了一个可能的解决方案)。
    • 我已尝试投票,但我需要先赢得一些声誉!如果我的声望达到 15,那么我一定会开始投票给你!
    【解决方案3】:

    我在这方面有点晚了,但是您可以在不自己进行迭代的情况下做到这一点,只需执行以下操作:

    classes.erase(0, classes.find_first_not_of(' '));
    

    这对于空字符串和带有前导空格的字符串可以正常工作,因此不需要额外的检查。使用标准库功能通常是一种很好的做法,尤其是当它们使您的代码更短并且可能更具可读性时。

    我不确定,但我认为这里使用的其他方法(反复擦除第一个字符)会导致底层字符串缓冲区被反复复制和/或重新分配,因此这种方式可能更有效。

    此外,可能值得考虑的是存在不止一种空格,例如制表符。 find_first_not_of 也可以做这样的事情:

    classes.erase(0, classes.find_first_not_of(" \t"));
    

    还有 unicode,但那是另一回事了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-29
      • 1970-01-01
      • 1970-01-01
      • 2021-09-02
      • 2018-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多