我正在面试并遇到一个问题+解决方案。 我在解决方案中有一行存在问题,希望也许有人可以解释它。
问题:
编写一个方法,用'%20'替换字符串中的所有空格。
解决方案:
public static void ReplaceFun(char[] str, int length) {
int spaceCount = 0, newLength, i = 0;
for (i = 0; i < length; i++) {
if (str[i] == ‘ ‘) {
spaceCount++;
}
}
newLength = length + spaceCount * 2;
str[newLength] = ‘\0’;
for (i = length - 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;
}
}
}
我的问题在于第9行。他怎么能将str [newLength]设置为'\ 0'?或换句话说,如何在不首先分配或类似内容的情况下接管所需的内存量? 是不是他跑过记忆?!
答案 0 :(得分:3)
假设这实际上意味着在C中(private static
无效C或C ++),它们就不能写了。他们永远不会分配一个新的str
,其长度足以容纳旧字符串加上%20
扩展。
我怀疑这个问题的另一部分是,str
已经足够长,可以容纳展开的%20
数据,length
就是长度str
中的字符串,不包括零终结符。
答案 1 :(得分:1)
这是有效的代码,但它不是很好的代码。在评估中我们完全正确地覆盖了初始str []的界限。这可能会导致一些相当不必要的副作用,具体取决于被覆盖的内容。