for 语句超出范围错误

Out of Range Error with for statement

本文关键字:范围 错误 语句 for      更新时间:2023-10-16

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

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()采用起始位置和长度。也就是说,数字。 你在这些点上传递字符。 因此,如果字符串是:

"  foo"

你基本上是在说:

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

classes.erase(32, 102);

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

尝试:

classes.erase(0, i);

您的解决方案应该更像:

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

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

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

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

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

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

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

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

还有 unicode,但那是另一罐蠕虫