for语句超出范围错误

时间:2014-11-13 23:51:52

标签: c++ string void erase

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

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

我对编码仍然很陌生,所以可能是正确方向的暗示,而不是答案,所以我可以从错误中吸取教训。

3 个答案:

答案 0 :(得分:1)

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

"  foo"

你基本上是这样说的:

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

classes.erase(32, 102);

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

尝试:

classes.erase(0, i);

答案 1 :(得分:0)

您的解决方案看起来应该更像:

int i(0);
while((i < classes.length()) && (classes[i] == ' ')) ++i;
classes.erase(0,i);
@Paul Roub已经很好地解释了它。

答案 2 :(得分:0)

我在这个问题上有点晚了,但你可以自己做这个,不用自己做迭代,只需做这样的事情:

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

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

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

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

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

还有unicode,但这又是另一种蠕虫了。