我正在尝试用字符串中的'%20'替换每个空格字符,我正在考虑为字符串类使用内置的替换函数。
目前,我有:
void replaceSpace(string& s)
{
int len = s.length();
string str = "%20";
for(int i = 0; i < len; i++) {
if(s[i] == ' ') {
s.replace(i, 1, str);
}
}
}
当我传入字符串“_a_b_c_e_f_g__”时,下划线代表空格,我的输出是“%20a%20b%20c%20e_f_g__”。同样,下划线代表空间。
为什么字符串开头附近的空格被替换,但是朝向结尾的空格不是?
答案 0 :(得分:8)
每次更换都会使s
更长,但您没有更新循环条件中使用的len
。
答案 1 :(得分:1)
修改刚刚扫描的字符串就像切割脚下的树枝一样。如果你小心的话可能会有用,但在这种情况下你不是。
即,您在开始时使用字符串len
,但每次更换时,您的字符串会变得更长,并且您将更换的位置推得更远(因此您永远无法覆盖所有这些位置)。
切割这个分支的正确方法是从它的末端(尖端)到树干 - 这样你总能有一个安全的立足点:
void replaceSpace(string& s)
{
int len = s.length();
string str = "%20";
for(int i = len - 1; i >= 0; i--) {
if(s[i] == ' ') {
s.replace(i, 1, str);
}
}
}
答案 2 :(得分:0)
您正在增长字符串,但只能循环到其初始大小。
在修改它时对循环进行循环很容易出错。
这是一个没有的解决方案:
void replace(string& s)
{
string s1;
std::for_each(s.begin(),
s.end(),
[&](char c) {
if (c == ' ') s1 += "%20";
else s1 += c;
});
s.swap(s1);
}
答案 3 :(得分:0)
正如其他人已经提到的那样,问题是你在循环中使用了初始字符串长度,但字符串在此过程中会变大。你的循环永远不会到达字符串的末尾。
您可以通过多种方法解决此问题。您可以更正您的解决方案,并确保按现在的方式转到字符串的末尾,而不是在开始循环之前。 或者你可以使用@molbdnilo的方式,它会沿途创建一个字符串的副本。 或者你可以使用这样的东西:
std::string input = " a b c e f g ";
std::string::size_type pos = 0;
while ((pos = input.find(' ', pos)) != std::string::npos)
{
input.replace(pos, 1, "%20");
}
答案 4 :(得分:0)
这是一个可以让您更轻松的功能:
string replace_char_str(string str, string find_str, string replace_str)
{
size_t pos = 0;
for ( pos = str.find(find_str); pos != std::string::npos; pos = str.find(find_str,pos) )
{
str.replace(pos ,1, replace_str);
}
return str;
}
因此,如果您想要替换空格,请尝试这样:
string new_str = replace_char_str(yourstring, " ", "%20");
希望这对你有所帮助! :)