您的位置:首页 > 职场人生

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

2017-02-27 22:06 113 查看
在网络编程中,如果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--] = '%';
}
else
Str[indexofNew--] = Str[indexofOriginal];

--indexofOriginal;
}
}


这个方法的时间复杂度为O(n),
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: