美文网首页
4 替换空格

4 替换空格

作者: WalkZeRo | 来源:发表于2016-06-26 20:25 被阅读0次

    题目

    把字符串中出现的空格替换为“%20”。示例“Hello World” 变为“Hello%20World"

    #include <stdio.h>
    #include <string.h>
    
    void ReplaceBlank(char string[], int length)
    {
        if(string == NULL || length<=0)
            return;
    
        //原始字符串的长度
        int originalLength = 0;
        int numberOfBlank = 0;
        int i = 0;
        while(string[i] != '\0')
        {
            ++originalLength;
    
            if(string[i] == ' ')
                ++numberOfBlank;
    
            ++i;
        }
    
    
        //转换后字符串长度
        int newLength = originalLength + (numberOfBlank <<1);
        if(newLength > length)
            return;
        //从后向前复制
        int indexOfOriginal = originalLength;
        int indexOfNew = newLength;
        while(indexOfOriginal>=0 && indexOfNew > indexOfOriginal)
        {
            if(string[indexOfOriginal] == ' ')
            {
                string[indexOfNew--] = '0';
                string[indexOfNew--] = '2';
                string[indexOfNew--] = '%';
            }
            else
            {
                string[indexOfNew--] = string[indexOfOriginal];
            }
    
            --indexOfOriginal;
        }
    }
    
    //==========测试代码========
    void Test(char* testName, char string[], int length, char expected[])
    {
        if(testName != NULL)
            printf("%s begins: ", testName);
    
        ReplaceBlank(string, length);
    
        if(expected == NULL && string == NULL)
            printf("passed.\n");
        else if(expected == NULL && string != NULL)
            printf("failed.\n");
        else if(strcmp(string, expected) == 0)
            printf("passed.\n");
        else
            printf("failed.\n");
    }
    
    // 空格在句子中间
    void Test1()
    {
        const int length = 100;
    
        char string[length] = "hello world";
        Test("Test1", string, length, "hello%20world");
    }
    
    // 空格在句子开头
    void Test2()
    {
        const int length = 100;
    
        char string[length] = " helloworld";
        Test("Test2", string, length, "%20helloworld");
    }
    
    // 空格在句子末尾
    void Test3()
    {
        const int length = 100;
    
        char string[length] = "helloworld ";
        Test("Test3", string, length, "helloworld%20");
    }
    
    // 连续有两个空格
    void Test4()
    {
        const int length = 100;
    
        char string[length] = "hello  world";
        Test("Test4", string, length, "hello%20%20world");
    }
    
    // 传入NULL
    void Test5()
    {
        Test("Test5", NULL, 0, NULL);
    }
    
    // 传入内容为空的字符串
    void Test6()
    {
        const int length = 100;
    
        char string[length] = "";
        Test("Test6", string, length, "");
    }
    
    //传入内容为一个空格的字符串
    void Test7()
    {
        const int length = 100;
    
        char string[length] = " ";
        Test("Test7", string, length, "%20");
    }
    
    // 传入的字符串没有空格
    void Test8()
    {
        const int length = 100;
    
        char string[length] = "helloworld";
        Test("Test8", string, length, "helloworld");
    }
    
    // 传入的字符串全是空格
    void Test9()
    {
        const int length = 100;
    
        char string[length] = "   ";
        Test("Test9", string, length, "%20%20%20");
    }
    
    int main(void)
    {
        Test1();
        Test2();
        Test3();
        Test4();
        Test5();
        Test6();
        Test7();
        Test8();
        Test9();
    
        return 0;
    }
    

    结果:

    QQ截图20160626202350.png

    思考

    合并两个数组(字符串)时,如果从前向后复制,需要重复移动的次数较多,那么可尝试从后向前复制,这样能减少移动的次数。

    相关文章

      网友评论

          本文标题:4 替换空格

          本文链接:https://www.haomeiwen.com/subject/cbqzdttx.html