请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
示例 1:
输入:s = "We are happy."
输出:"We%20are%20happy."
1.思路:统计扩容大小,由后向前
2.扩容大小 空格数*2
3.判断等于空格 s[i] = =’ ’
4.新旧字符串的范围 0-s.size()-1
5.字符串填充复制加’ ‘
6.s.size() 的长度获取字符串长度,不包含终止符,
7.strlen 函数(和size()函数作用同)和 sizeof运算符区别
strlen是函数,运行时出结果,计算字符串长度,遇到 \0结 束,不包含 \0
sizeof是运算操作符,编译时出结果,计算内存空间大小,包括字符串自带的 \0
练习:
char *str1 = "asdfgh";
char str2[] = "asdfgh";
char str3[8] = {'a', 's', 'd'};
char str4[] = "as\0df";
sizeof(str1) = 4; strlen(str1) = 6;//str是字符指针变量,32位操作系统大小为4
sizeof(str2) = 7; strlen(str2) = 6;
sizeof(str3) = 8; strlen(str3) = 3;
sizeof(str4) = 6; strlen(str4) = 2;
char c[] = "asdsds";
char* cc = c;
char cn[40] = "asdsds";
int a[] = {1,2,3,4,5,6};
int* aa = a;
cout << sizeof(c) << sizeof(cc) << sizeof(*cc) << sizeof(cn);
cout << sizeof(a) << sizeof(aa) << sizeof(*aa);
sizeof(c) = 7 //c是数组,计算到'\0'位置,结果为6*1+1=7
sizeof(cc) = 8 //cc为指针类型,大小为8
sizeof(*cc) = 1 //*cc指向c的第一个字符,大小为1
sizeof(cn) = 40 //开辟40个char空间,大小为40*1=40
sizeof(a) = 24 //a是数组,但不需计算到'\0',结果为6*4=24
sizeof(aa) = 8 //aa为指针类型,大小为8
sizeof(*aa) = 4 //*aa指向a的第一个数字,大小为4
8.为什么这里的cn和a不代表首地址?
char cn[40] = “asdsds”; //sizeof(cn) =40
int a[] = {1,2,3,4,5,6};
int* aa = a; //sizeof(a) = 24; sizeof(*aa) =4;
{
int a[5]={1,2,3,4,5};
printf("sizeof数组名=%d\n",sizeof(a));
printf("sizeof *数组名=%d\n",sizeof(*a));
}
运行结果
sizeof数组名=20
sizeof *数组名=4
数组名代表首地址,sizeof(数组名)为整个数组所占内存空间大小
*数组名代表首地址所指内容,即首元素
程序如下:
string replaceSpace(string s) {
int count = 0;
//统计扩容大小,由后向前
for(int i = 0; i < s.size(); i++){
if(s[i] == ' ')count++; //空格怎么表示
}
int lenths = s.size();
int newlenth = 0;
s.resize(lenths+count*2);
for(int j = s.size()-1,lenth =lenths-1; j >= 0;lenth--){ //j的取值 0-s.size()
if(s[lenth] == ' ') {
s[j--]='0';
s[j--]='2';
s[j--]='%';
}
else{
s[j] = s[lenth];
j--;
}
}
return s;