我正在尝试修剪字符串前面的空格(类)。出于某种原因,每次我运行代码时都会收到错误消息,我不知道如何修复它。
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
我对编码仍然很陌生,所以可能是正确方向的暗示,而不是答案,所以我可以从错误中吸取教训。
答案 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,但这又是另一种蠕虫了。