前情提要:在网络编程中,如果URL参数中含有特殊字符,如空格、’#‘等,可能导致服务器端无法获得正确的参数值。我们需要将这些特殊符号转换成服务器可以识别的字符。转换的规则是在’%‘后面跟上ASCII码的两位十六进制的表示。比如空格的ASCII码是32,即十六进制的0x20,因此空格被替换成"%20"。再比如’#'的ASCII码为35,即十六进制的0x23,它在URL中被替换为"%23"。
方法一:在原字符串上做替换
由原来的一个空格,替换后变成'%'
、'2'
和'0'
三个字符,字符串会因此变长,那么就需要尝试重新调整之前指针s
所指向的内存大小。
char* replaceSpace(char* s){
if(s==NULL) return NULL;
int i=0,originalLength=0,newLength=0,blackspace=0;
while(s[i]!='\0'){
if(s[i]==' ') blackspace++;
originalLength++;
i++;
}
newLength=originalLength + 2 * blackspace;
int p1=originalLength,p2=newLength;
s = (char*)realloc(s, sizeof(char) * (newLength+1));
while(p1 >=0 && p1<p2){
if(s[p1]==' '){
s[p2--]='0';
s[p2--]='2';
s[p2--]='%';
}else{
s[p2--]=s[p1];
}
p1--;
}
return s;
}
realloc函数
描述
C 库函数 void *realloc(void *ptr, size_t size) 尝试重新调整之前调用 malloc 或 calloc 所分配的 ptr 所指向的内存块的大小。
声明
下面是 realloc() 函数的声明。
void *realloc(void *ptr, size_t size)
参数
ptr -- 指针指向一个要重新分配内存的内存块,该内存块之前是通过调用 malloc、calloc 或 realloc 进行分配内存的。如果为空指针,则会分配一个新的内存块,且函数返回一个指向它的指针。
size -- 内存块的新的大小,以字节为单位。如果大小为 0,且 ptr 指向一个已存在的内存块,则 ptr 所指向的内存块会被释放,并返回一个空指针。
返回值
该函数返回一个指针 ,指向重新分配大小的内存。如果请求失败,则返回 NULL。
C库函数 - realloc()
方法二:创建新字符串
创建一个新的字符串并在新的字符串上做替换,那么我们可以自己分配足够多的内存。
class Solution {
public:
string replaceSpace(string s) {
//方法一:创建新的字符串
string n;
for(char c:s){
if(c==' '){
n.push_back('%');
n.push_back('2');
n.push_back('0');
}else{
n.push_back(c);
}
}
return n;
}
};