for 语句超出范围错误
Out of Range Error with for statement
我正在尝试从字符串(类)的前面修剪空格。出于某种原因,每次我运行代码时,我都会收到一条错误消息,我不知道如何解决它。
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,但那是另一罐蠕虫
相关文章:
- "myClock"未在此范围错误中声明
- 包含来自另一个文件的函数会导致范围错误(openFoam)
- Visual C:命名空间范围错误或晦涩功能?
- 在遍历字符串时,为什么我没有超出范围错误,即使我已经超出了它的长度?
- 此范围错误中未声明如何修复
- 尝试声明函数的局部变量,但得到范围错误
- c ++ to_string未在此范围错误 [Windows + Devcpp 环境] 中声明
- 将文件读取到向量的向量,超出范围错误
- 向量下标出的范围错误.即使向量的索引大于访问数据的索引,也会发生误差
- Eratosthenes C 的筛子 - 内存处的范围错误
- 向量:内存处的范围错误
- 测试完美哈希函数时超出范围错误
- 为什么此代码会给出 Vector 超出范围错误
- 在填充 Arduino 草图时出现范围错误
- 如何修复C++中矢量的"下标超出范围"错误?
- CPP-模板范围错误
- 在此范围错误中未声明函数错误
- C 表达式:向量下标出范围错误线:1733
- 无法在好友函数中实例化类?我没有得到在范围错误中声明
- 带有类的嵌套结构.范围错误