面试谜语(字符串操作) - 需要解释

时间:2015-01-15 20:17:53

标签: string memory-management

我正在面试并遇到一个问题+解决方案。 我在解决方案中有一行存在问题,希望也许有人可以解释它。

问题:

  

编写一个方法,用'%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'?或换句话说,如何在不首先分配或类似内容的情况下接管所需的内存量? 是不是他跑过记忆?!

2 个答案:

答案 0 :(得分:3)

假设这实际上意味着在C中(private static无效C或C ++),它们就不能写了。他们永远不会分配一个新的str,其长度足以容纳旧字符串加上%20扩展。

我怀疑这个问题的另一部分是,str已经足够长,可以容纳展开的%20数据,length就是长度str中的字符串,不包括零终结符。

答案 1 :(得分:1)

这是有效的代码,但它不是很好的代码。在评估中我们完全正确地覆盖了初始str []的界限。这可能会导致一些相当不必要的副作用,具体取决于被覆盖的内容。