gpt4 book ai didi

c++ - 在字符串迭代中替换(out_of_range)

转载 作者:太空宇宙 更新时间:2023-11-04 15:52:14 26 4
gpt4 key购买 nike

我编写了一个对字符串进行百分号编码的函数,如下所示:

string percent_encode(string str)
{
string reserved =
// gen-delims
":/?#[]@"
// sub-delims
"!$&'()*+,;="
;

for(string::iterator i = str.begin(); i < str.end(); i++) {
int c = *i;
// replaces reserved, unreserved non-ascii and space characters.
if(c > 127 || c == 32 || reserved.find(*i) != string::npos) {
std::stringstream ss;
ss << std::hex << c;
str.replace(i, i + 1, "%" + ss.str());
}
}
return str;
}

当我为像“a&b”这样的字符串调用这个函数时,会抛出一个超出范围的异常:

terminate called after throwing an instance of 'std::out_of_range'
what(): basic_string::replace

我用调试器跟踪了这个异常,发现替换工作正常,但它以某种方式迭代超出了 end();

这是我在观察迭代器“i”时得到的:

{_M_current = 0x7fc43d61bd78 "a&b"}
{_M_current = 0x7fc43d61bd79 "&b"}
{_M_current = 0x7fc43d61bd7a "b"}
{_M_current = 0x7fc43d61bd7b ""}
{_M_current = 0x7fc43d61bd7c "o = a&b\n"}
{_M_current = 0x7fc43d61bd7d " = a&b\n"}

然后它会尝试替换“=”并因 out_of_range 异常而失败。我不明白,迭代器怎么可能明显超出 end()。

如果有人能向我解释这是怎么可能的,我将不胜感激,因为我在网上找不到遇到同样问题的人。

感谢和问候,

真实

编辑:

啊,我真的想复杂了。 X)我现在就是这样解决的。

string percent_encode(string str)
{
string reserved =
// gen-delims
":/?#[]@"
// sub-delims
"!$&'()*+,;="
;

std::stringstream ss;

for(string::iterator i = str.begin(); i < str.end(); i++) {
// encodes reserved, unreserved non-ascii and space characters.
int c = *i;
if(c > 126 || c == 32 || reserved.find(*i) != string::npos) {
ss << '%' << std::hex << c;
} else {
ss << *i;
}
}

return ss.str();
}

谢谢迭戈 :)

最佳答案

replace 使当前迭代器无效,因此它可能超出末尾。

有几种方法可以正确编写此代码。例如,生成(并返回)一个新字符串会更容易,甚至可能更有效(请注意,替换也必须将字符串的其余部分移动一个位置)。此外,使用索引更新字符串长度和位置。

但是返回一个全新字符串的选项是我能想到的最好的选择。功能更强大:)

关于c++ - 在字符串迭代中替换(out_of_range),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6065466/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com