我有一个功能可以反转字符串中的单词,例如"嗨,Sam"它会将一个字符串反转为" Sam在那里嗨"。
它通过反转一个字符串,然后反转单词来实现
但是在完成之后,我在线路上遇到了一个段故障
我怀疑迭代器试图在有效范围之外取消引用
但它首先检查范围,所以如果它无效,它将立即退出。
我哪里错了?
void rev(string& str) {
std::reverse(str.begin(), str.end());
auto bIter = str.begin();
auto eIter = str.begin();
while (eIter != str.end()) {
for (;eIter != str.end() && (*eIter) != ' '; eIter++) {}
std::reverse(bIter, eIter);
bIter = ++eIter;
}
}
答案 0 :(得分:6)
当内部for循环结束时eIter == str.end()
时,由于while循环的最后一行(str.end()
),它超出了++eIter
。
添加break
解决了这个问题。
void rev(string& str) {
std::reverse(str.begin(), str.end());
auto bIter = str.begin();
auto eIter = str.begin();
while (eIter != str.end()) {
for (;eIter != str.end() && (*eIter) != ' '; eIter++) {}
std::reverse(bIter, eIter);
if (eIter == str.end()) break; // HERE
bIter = ++eIter;
}
}
答案 1 :(得分:0)
您的问题是,即使是eIter
,您也会增加str.end()
。
正如您已经使用std,您可以通过std::find
转换您的循环:
void rev(std::string& str) {
std::reverse(str.begin(), str.end());
for (auto it = str.begin(); it != str.end(); ) {
auto endWordIt = std::find(it, str.end(), ' ');
std::reverse(it, endWordIt);
it = (endWordIt == str.end()) ? str.end() : (endWordIt + 1);
}
}