字符串即若干字符组成的序列,每个字符串都以‘\0’结尾,由于这个特点,每个字符串都有一个额外的字符开销,所以要注意字符串越界的问题。

如:

charstr[10];strcpy(str,"0123456789");//越界

同时,很多函数如strcpy、strlen、strcmp、strstr等字符串函数都是用了这个特点实现。

为节省内存,c和c++把常量字符串放到了静态区,当几个指针赋值给相同的的字符串常量时,它们会指向相同的地址。但用常量初始化数组则不同

chara1[]="helloword";chara2[]="helloword";//a1和a2地址不同char*p1="helloword";char*p2="helloword";//p1和p2地址相同,p1和p2均指向“helloword”这个空间

ps:常量具有只读属性

chara1[]="helloword";a1[5]=',';//正确,可更改元素char*p="helloword";p[5]=',';//错误,*p指向一个常量,不可更改


练习:

实现一个函数,把字符串中每个空格替换成“%20”。

例:输入“we are happy”

输出“we%20are%20happy”


实现方法2.0

考虑从尾部一个一个向后移,先遍历字符串,统计空格个数,由于计算新字符串长度(每替换一个空格,长度+2),遇到空格就替换,时间复杂度O(n),利用数组下标即可以实现字符的移动

#include<iostream>#include<assert.h>#include<string.h>usingnamespacestd;voidReplaceBlank(char*str){assert(str);//断言str不为空intblank=0;//空格数char*p=str;size_tlength=strlen(str);while(*p!='\0'){if(*p=='')//遍历查找空格个数blank++;p++;}size_tnewlen=blank*2+length;//替换空格为%20的新长度while(newlen>length){if(str[length]!=''){str[newlen]=str[length];newlen--;length--;}else{str[newlen--]='0';str[newlen--]='2';str[newlen--]='%';//新长度减3length--;//原长度减一(空格)}}}


实现方法2.1:

上面使用数组实现,同样,指针也可以做到。用一个指针p1指向字符串末尾,另一个p2指向替换之后的字符串的末尾。向前移动指针p1,逐个移动到p2指向的空间,直到碰到空格,把p1向前移动一格,在p2前插入“%20”,当p1和p2指向同一位置,替换完毕

voidReplaceBlank(charstr[]){assert(str);size_tlength=strlen(str);size_tblank=0;//空格个数size_ti=0;while(str[i]!='\0'){if(str[i]=='')blank++;i++;}if(blank==0)return;size_tnewlen=blank*2+length;char*p1=str+length;char*p2=str+newlen;while(p1!=p2){if(*p1!=''){*p2=*p1;p1--;p2--;}else{p1--;*p2--='0';*p2--='2';*p2--='%';}}}

测试方法

1.空格分别在字符串中间和最后

2.无空格

3.空字符串

测试voidtest(){charstr[20]="wearehappy";cout<<str<<endl;ReplaceBlank(str);cout<<str<<endl;}intmain(){test();getchar();return0;}