程序员面试笔记---替换空格

来源:互联网 发布:淘宝千里眼怎么安装 编辑:程序博客网 时间:2024/06/03 22:44
在网络编程中,如果URL参数中含有特殊字符,如空格、#等,可能导致服务器端无法获得正确的参数值。因此,需要将这些特殊符号转换为服务器可以识别的字符。
转换的规则:在%后面跟上ASCII码的两位十六进制的表示。如空格的ASCII码是32,即十六进制的0x20,因此空格被替换成“%20”.

问题:如何实现一个函数,把字符串中的每个空格替换成“%20”.例如:My name is Irene. 输出为My%20name%20is%20Irene...

做法:首先遍历一次字符串,统计出字符串中空格的总数,并计算出替换之后字符串的总长度。每替换一个空格,长度增加2,故替换之后字符串的长度等于原来的长度加上2*空格数目。在My name is Irene.中,字符串长度为18,替换之后的长度为24.
源代码编辑如下:亲测有效哦。。
#include<iostream>#include<string>//不是<string.h>,带.h的是C语言中的头文件void RepalceBlank(char Str[], int length);using namespace std;//strlen  计算字符串里面一共有多少个字符//sizeof  计算字符串占的总内存空间int main(){char Str[100];//cin >> Str;//不能读取空格gets_s(Str);////////////////////////////getline的用法/*string ssttr;getline(cin, ssttr);int length1 = sizeof(ssttr);*/////////////////////////////int length = sizeof(Str);RepalceBlank(Str, length);//数组名称直接作为指针进行地址传递。cout << Str << endl;cout << strlen(Str) << endl;return 0;}//length是字符数组的容量void RepalceBlank(char Str[], int length){if (Str == NULL || length <= 0)return;int originalLength = 0;//字符串Str 的实际长度int numberofBlank = 0;int i = 0;//遍历字符串,统计字符串的实际长度以及空格数while (Str[i] != '\0'){++originalLength;if (Str[i] == ' ')++numberofBlank;++i;}int newlength = originalLength + numberofBlank * 2;//替换空格之后的长度
        //如果数组溢出,放弃替换。if (newlength > length)return;        //替换前后两个数组的指针序列号int indexofOriginal = originalLength;int indexofNew = newlength;        //从替换前后两个数组的最后一个字符开始替换,所有的字符只移动一次,时间复杂度比较小。while (indexofOriginal >= 0 && indexofNew> indexofOriginal){if (Str[indexofOriginal] == ' '){Str[indexofNew--] = '0';Str[indexofNew--] = '2';Str[indexofNew--] = '%';}elseStr[indexofNew--] = Str[indexofOriginal];--indexofOriginal;}}

这个方法的时间复杂度为O(n),
0 0