问题描述
请实现一个函数,把字符串中的每个空格替换成”%20”。例如,输入“We are happy.”,则输出“ We%20are%20happy.”。
在网络编程中,如果URL参数中含有特殊字符,如空格、’#’等,可能导致服务器端无法获得正确的参数值。我们需要将这些特殊符号转换成服务器可以识别的字符。转换的规则是在’%’后面跟上ASCII码的两位十六进制的表示。比如空格的ASCII码是32,即十六进制的0x20,因此空格被替换成”%20”。再比如’#’的ASCII码为35,即十六进制的0x23,它在URL中被替换为”%23”。
函数实现
#include<stdio.h>
#include<string.h>
void replace_black(char *str)
{
char *pstr=str;
int oldlen=strlen(str);
int newlen=0;
int count=0;
while(*pstr)
{
if(*pstr==' ')
count ++;
pstr++;
}
newlen=oldlen + 2 * count;
while(oldlen < newlen)
{
if(str[oldlen]==' ')
{
str[newlen--] = '0';
str[newlen--] = '2';
str[newlen--] = '%';
oldlen--;
}
else
str[newlen--]=str[oldlen--];
}
}
int main()
{
char str[20]="we are happy";
replace_black(str);
printf("%s\n",str);
return 0;
}
//高质量代码风格
#include <stdio.h>
/*length为字符数组string的总容量*/
void ReplaceBlank(char string[], int length) {
/*边界条件、特殊输入*/
if(string == NULL || length <= 0) {
return;
}
/*originalLength为字符串string的实际长度*/
int originalLength = 0;
int numberOfBlank = 0;
char *pstr = string;
while(*pstr) {
++ originalLength;
if (*pstr == ' ') {
++ numberOfBlank;
}
pstr ++;
}
/*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] == ' ') {
string[indexOfNew --] = '0';
string[indexOfNew --] = '2';
string[indexOfNew --] = '%';
} else {
string[indexOfNew --] = string[indexOfOriginal];
}
-- indexOfOriginal;
}
}
int main(void) {
char str[20] = {"We are happy."};
ReplaceBlank(str, 20);
puts(str);
return 0;
}