替换空格
题目:实现一个函数,把字符串中的每个空格替换成%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++; } }