替换空格

题目:实现一个函数,把字符串中的每个空格替换成%20。例如,输入“We are happy.”,输出”We%20are%20happy.“。要求在原有的字符串中进行替换,不得使用额外的空间,原有字符串空间保证足够大。

 

直接从前往后地做替换,会导致一些字符移动多次。转换思路,从后往前做替换,这样每个字符只需要移动一次。

首先遍历一遍字符串,得出空格的数目,因为空格占一个字符,替换后%20占3个字符,那么每多一个空格,所需空间增加2个字符。例如上面例子,有2个空格,算上字符串结束标志'\0',共14个字符,替换后变成14+2*2=18个字符。

 

#include <stdio.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 + 2 * numberOfBlank;    //空格被替换后的长度
    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--;
    } 
}

int main() {
    char s[30] = "We are happy.";
    
    ReplaceBlank(s, 30);
    int i = 0;
    while(s[i] != '\0') {
        printf("%c",s[i]);
        i++;
    }

}

 

posted @ 2016-03-17 20:17  没有梦想的小灰灰  阅读(160)  评论(0编辑  收藏  举报