题目
请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
代码
#include<cstdio>
#include<cstdlib>
#include<iostream>
using namespace std;
class Solution {
public:
void replaceSpace(char *str, int length) {
#if 1
char* s;
int count = 0;
for (int i = 0; str[i] != '\0'; i++){
if (str[i] == ' ')
count += 3;
else
count++;
}
s = (char *)malloc(sizeof(char)*count);
str[count] = '\0';
int k = 0;
s[count] = '\0';
for (int i = 0; str[i] != '\0'; i++){
if (str[i] == ' '){
s[k++] = '%';
s[k++] = '2';
s[k++] = '0';
}
else
s[k++] = str[i];
}
//str = s;
//无效的赋值,出这个函数,s地址不存在,str无法访问
for (int i = 0; i <count; i++)
str[i] = s[i];
str[count] = '\0';
cout << str;
#endif
}
};
int main(){
Solution s;
char *str = (char *)malloc(40); //这里需要动态分配。
// str = "Hello World"; 在只读空间,不可以分配内存。
strcpy(str," Hello World ");
s.replaceSpace(str, 14);
return 0;
}
本题注意点
char*的赋值
char str = (char )malloc(40);
str = “Hello World”;
第一种赋值的方式是动态分配,在程序的其他位置可以动态分配空间。第二种赋值的方式是静态分配,在内存分配只读空间,不可以动态分配。这是两种赋值方式的区别。
指针赋值
str = s;
这种方式赋值当运行出了函数,就会失效,s已经被销毁,s的地址就销毁了,故str赋值失效。这里是个大坑啊,希望读者不要犯这种错误。