TSINGHUAUNIVERSITY■字符串字符串的表示三种理解角度:作为字符数组,作为指向字符的指针,作为抽象的字符串整体字符数组与字符指针的差异标准字符串库字符串模板TSINGHUAUNIVERSITY■字符数组字符数组的定义与普通数组定义格式相同示例:chars[8]={'C','P','P','-','P','r','o','g'};字符数组的存储布局字符数组的访问按照数组格式进行,逐一访问每个元素很不方便s[0]sCs[1]Ps[2]Ps[3]-s[4]Ps[5]rs[6]os[7]gTSINGHUAUNIVERSITY■字符数组多个字符数组连续存储时的问题如何区分存储空间刚好连续的多个字符数组?示例:chars[8]={'C','P','P','-','P','r','o','g'};chart[5]={'H','e','l','l','o'};无法区分!解决方案:字符数组末尾添加结束标志‘\0’示例:chars[9]={'C','P','P','-','P','r','o','g','\0'};chart[6]={'H','e','l','l','o','\0'};s[0]sCs[1]Ps[2]Ps[3]-s[4]Ps[5]rs[6]os[7]gt[0]tHt[1]et[2]lt[3]lt[4]oTSINGHUAUNIVERSITY■字符数组实际字符数组的存储布局优点可以在程序运行时通过测试‘\0’字符确定字符数组是否结束,而不需要了解数组元素个数,使处理元素个数未知的数组成为可能通过指针运算直接操作字符数组中的字符,而不再使用数组格式访问字符元素特别说明字符数组的分配空间必须能容纳额外的结束标志‘\0’t[0]tHt[1]et[2]lt[3]lt[4]os[0]sCs[1]Ps[2]Ps[3]-s[4]Ps[5]rs[6]os[7]gt[5]\0s[8]\0TSINGHUAUNIVERSITY■字符数组的访问编写函数,返回字符c在字符串s中的首次出现位置unsignedintFindCharFirst(charc,chars[]){unsignedinti;if(!s){coutFindCharFirst:Illegalstring.\n;exit(1);}for(i=0;s[i]!='\0';i++){if(s[i]==c)returni;}returninexistent_index;//0xFFFFFFFF}TSINGHUAUNIVERSITY■字符指针编写函数,返回字符c在字符串s中的首次出现位置unsignedintFindCharFirst(charc,char*s){char*t;if(!s){coutFindCharFirst:Illegalstring.\n;exit(1);}for(t=s;*t!='\0';t++){if(*t==c)returnt-s;}returninexistent_index;//0xFFFFFFFF}TSINGHUAUNIVERSITY■抽象字符串抽象字符串的定义typedefchar*STRING;typedefconstchar*CSTRING;FindCharFirst函数的声明格式下述三种声明格式完全相同:unsignedintFindCharFirst(charc,chars[]);unsignedintFindCharFirst(charc,char*s);unsignedintFindCharFirst(charc,STRINGs);TSINGHUAUNIVERSITY■字符数组与字符指针的差异字符数组量的定义、初始化与存储chars[9]={'C','P','P','-','P','r','o','g','\0'};字符指针量的定义、初始化与存储char*s=CPP-Prog;后者存在单独的指针变量,前者则没有s[0]sCs[1]Ps[2]Ps[3]-s[4]Ps[5]rs[6]os[7]gs[8]\0CPP-Prog\0s字符串基地址TSINGHUAUNIVERSITY■字符数组与字符指针的差异按指针格式定义字符串,可以直接赋值示例:char*s;s=CPP-Prog;//正确字符串文字首先分配空间,然后将其基地址赋给s,使s指向该字符串基地址按字符数组格式定义字符串,不能直接赋值示例:chars[9];s=CPP-Prog;//错误不能对数组进行整体赋值操作原因:数组空间已分配,字符串文字空间已分配,且它们位于不同位置,不能直接整体复制TSINGHUAUNIVERSITY■返回字符串的函数:正确例编写函数,将某个字符c转换为字符串STRINGTransformCharIntoString(charc){STRING_s=(STRING)malloc(2);_s[0]=c;_s[1]='\0';return_s;}TSINGHUAUNIVERSITY■返回字符串的函数:错误例编写函数,将某个字符c转换为字符串char*TransformCharIntoString(charc){char_s[2];_s[0]=c;_s[1]='\0';return_s;}错误函数定义对于所有返回值为指针类型的函数,都不能返回在函数内部定义的局部数据对象——所有局部对象在函数结束后不再有效,其地址在函数返回后没有意义TSINGHUAUNIVERSITY■标准字符串库标准库中关于字符串处理的函数很多,均定义于头文件“cstring”中常用字符串函数char*strcat(char*dest,constchar*src);intstrcmp(constchar*s1,constchar*s2);char*strcpy(char*dest,constchar*src);intstrlen(constchar*s);char*strtok(char*token,constchar*delimiters);不建议使用标准字符串库,使用string类替代TSINGHUAUNIVERSITY■string类定义于头文件“string”中声明与构造string对象strings=abcdefg;strings(abcdefg);读取与写入string对象coutsendl;cins;//读取以空格、制表符与回车符分隔的单词getline(cin,s,'\n');//读取包含空格和制表符在内的整行TSINGHUAUNIVERSITY■string类获取string对象的长度strings=abcdefg;inta=s.length();改变string对象的容量大小s.resize(32);//将s设为32字符长,多余舍弃,不足空闲s.resize(32,'=');//多余舍弃,不足补‘=’string对象的追加操作strings1=abcd,s2=efg;s1.append(s2);//将字符串s2追加到s1尾部TSINGHUAUNIVERSITY■string类string对象的比较操作strings1=abcdefg,s2=abcdxyz;inta=s1.compare(s2,0);//从0号位字符开始比较string对象的查找操作strings1=abcdefg,s2=bcd;inta=s1.find(s2,0);//从字符串开头开始查找,结果为s2在s1中首次出现的位置