- 描述:
实现一个函数,把字符串中的每个空格替换成“%20”。
- 例如:
输入:i am a boy!
输出:i%20am%20a%20boy!
- 问题拓展:
这样的问题在网络编程中会实际运用,如果URL参数中含有特殊字符,如空格、‘#’等,可能会导致服务器无法获得正确的参数值,所以就需要将这些字符转化为可以识别的字符。
转换规则是在%后面加上ASCII码的后两位十六进制的表示。
比如:空格ASCII码是32,即十六进制0X20,因此被替换成“%20”。
- 问题分析:
创建新的字符串,在新的字符串上进行替换;
在旧的字符串上进行替换,由于替换成“%20”,每次一个字符被替换成三个,如果处理不当,就会覆盖原字符串内容。
- 代码实现:
#include<stdio.h>
#include<stdlib.h>
#include<String.h>
void ReplaceBlank(char string[], int length)
{
int StringLen = 0;
int BlankLen = 0;
int NewCharLin = 0;
int OriginalIndex = 0;
int NewIndex = 0;
int i = 0;
if (NULL == string || length <= 0)
return;
else
{
while (string[i] != '\0')
{
StringLen++; //字符总长
if (string[i] == ' ')
{
BlankLen++; //空格数
}
i++;
}
NewIndex = StringLen + BlankLen * 2;
OriginalIndex = StringLen;
//NewIndex = NewCharLin;
while (OriginalIndex >= 0 && NewIndex > OriginalIndex)
{
if (string[OriginalIndex] == ' ')
{
string[NewIndex--] = '0';
string[NewIndex--] = '2';
string[NewIndex--] = '%';
}
else
{
string[NewIndex--] = string[OriginalIndex];
}
OriginalIndex--;
}
}
}
void test()
{
char Str[20] = "i am a boy!";
printf("%s\n", Str);
ReplaceBlank(Str, 20);
printf("%s\n", Str);
}
void test1()
{
char Str[20] = "";
printf("%s\n", Str);
ReplaceBlank(Str, 20);
printf("%s\n", Str);
}
void test2()
{
char Str[20] = " ";
printf("%s\n", St;
ReplaceBlank(Str, 20);
printf("%s\n", Str);
}
int main()
{
test();
test1(); //特殊情况检验
test2(); //特殊情况检验
return 0;
}
- 时间复杂度:
时间复杂度:O(n)