【发布时间】:2016-07-13 22:36:24
【问题描述】:
难以理解部分代码;我得到的输出也是错误的。问题是用 '%20' 替换字符串中的所有空格。完整代码如下所示;它可以编译,但不能完全按应有的方式运行。
#include <iostream>
#include <string>
using namespace std;
void replaceSpaces(string str){
//Getting the length of the string, counting the number of spaces
int strLen = str.length();
int i, count = 0;
for (i = 0; i <= strLen; i++) {
if(str[i]==' ')
count++;
}
//Determining the new length needed to allocate for replacement characters '%20'
int newLength = strLen + count * 2;
str[newLength] = '\0';
for (i = strLen - 1; i >= 0; i--) {
if (str[i] == ' ') {
str[newLength - 1] = '0';
str[newLength - 2] = '2';
str[newLength - 3] = '%';
newLength = newLength - 3;
}
else {
str[newLength - 1] = str[i];
newLength = newLength -1;
}
}
cout << str <<endl;
}
int main() {
string str = "hello jellybean hello";
replaceSpaces(str);
return 0;
}
我可能遗漏了一些明显的东西,但是当在这一行中分配新的字符串长度时:
int newLength = strLen + count * 2;
这里我们将空格数乘以 2,但如果我们试图用 '%20' 替换所有空格,为什么不乘以 3?
str[newLength] = '\0';
这行是否表示字符串中最后一个字符之后的位置被分配了一个空空格?
我也对else 声明感到困惑。
else {
str[newLength - 1] = str[i];
newLength = newLength -1;
}
不确定我是否完全了解执行此操作的情况。
函数编译运行时,如果
string str = "hello jellybean hello";
预期的输出将是 hello%20jellybean%20hello,但我得到的输出是 hello%20jellybean%20h。
在时间复杂度上,既然有两个独立的for循环,那么时间复杂度会是O(n)吗?
我知道我问了很多不同的问题,非常感谢您的任何回答!
【问题讨论】:
-
索引(和设置)字符串中的任意位置不会自动将字符串增长到该长度。在那之后,我停止了寻找。哦,好吧,我确实读过关于
* 3的问题。对于每个替换,您减去一个字符 - 原始空间 - 并添加 3。因此 ... -
str[newLength]将访问超出为str分配的内存空间的内存位置。您要做的是创建一个具有新大小的全新字符串,复制旧字符串,同时用“%20”替换空格 -
最简单的方法是使用
strtok()标记您的字符串(在空格处分割并创建字符串标记)。然后,只需遍历标记并在每个标记之间放置一个 %20...char *tokens = strtok(my_string, " "); while(tokens) { cout << token << "%20"; tokens = strtok(NULL, " "); } -
谷歌“c++ urlencode”。
-
@Ingenioushax -
strtok不适用于std::string。而且它很少是正确的答案。
标签: c++ string memory-management str-replace