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

面试题4:替换字符串中的空格

2016-06-07 21:04 274 查看
1.题目:实现一个函数,把字符串中的每个空格替换成%20,例如输入:We are happy!, 则被替换成We%20are%20happy!

在网络编程中,URL地址中常包含特殊的字符如空格等,为了便于服务器解析,将这些特殊的字符转换成服务器可以识别的字符。转换规则是在%后面加上ASCII码的两位的十六进制表示,空格的ASCII码为32,十六进制为0x20,则替换的结果就是%20.

分析:假设只是在源字符串上进行替换,并且保证输入的字符串的后面有足够的内存。如果按照常规的解法,从前到后遍历字符串,则每遇到一个空格,都会将字符串后面的部分向后移动两个位置,如果有多个空格的话,将会移动多次。可以考虑从后开始扫描空格的位置,可以只移动一次就将响应的字符移到最终的位置。可以先统计出空格的个数,则新串的长度为原串的长度加上空格的个数*2,然后从后开始扫描字符串,如果不是空格,则从后面一次复制字符,如果碰到空格,则填充响应的%20,并向前移动三个位置。整个过程可以方便的用指针来实现。如下图:



源码:

/*替换字符串中的空格*/
#include <iostream>
#include <string>
using namespace std;
#define MAXLENGTH 100

/*length 为字符数组string的总容量*/
void ReplaceBlank(char string[], int length)
{
if (string == NULL && length <= 0)
return;

/*originalLength 为字符串string的实际长度*/
int originalLength = 0;
int numberOfBlank = 0;//空格的数量
int i = 0;
while (string[i] != '\0')
{
++originalLength;

if (string[i] == ' ')
++numberOfBlank;

++i;
}

/*newLength 为把空格替换成'%20'之后的长度*/
int newLength = originalLength + numberOfBlank * 2;
if (newLength > length)
return;

int indexOfOriginal = originalLength;//指向原字符串的末尾
int indexOfNew = newLength;//指向新串的末尾
while (indexOfOriginal >= 0 && indexOfNew > indexOfOriginal)
{
if (string[indexOfOriginal] == ' ')//当遇到空格时,填充之后,应该前进3个位置
{
string[indexOfNew--] = '0';
string[indexOfNew--] = '2';
string[indexOfNew--] = '%';
}
else
{
string[indexOfNew--] = string[indexOfOriginal];
}

--indexOfOriginal;
}
}

int main()
{
char c[MAXLENGTH] = "We are happy!";
cout << "原字符串为:" << c << endl;
ReplaceBlank(c, MAXLENGTH);
cout << "替换之后的结果为:" << c << endl;
system("PAUSE");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: