重庆邮电大学计算机科学与技术学院冯潇fengxiao@cqupt.edu.cnstringC++标准库利用string完成ASCCII码和宽字符集的字符串处理–string是C++封装的字符串类,处理ASCII码构成的字符串–wstring是C++封装的字符串类,完成宽字符集(如Unicode字符集)的处理采用char*和constchar*表示的字符串,通常称为C-string(C风格的字符串)C++利用模板类basic_string来实现string,具体地:–typedefbasic_stringcharstring;常见的字符串定义语法strings1;//初始化空字符串s1strings2(nico);//用‘n’‘i’‘c’‘o’初始化s2strings3(nico,5);//用‘n’‘i’‘c’‘o’‘\0’初始化s3strings4(5,'\0');//用‘\0’初始化5个元素常见的错误定义方法:–string不提供int或char自动转换为字符串的功能–stringerror1='c';//错误–stringerror2('U');//错误–stringerror3=22;//错误–stringerror4=NULL;//错误string的输入不带空格的字符串输入–stringstr;–cinstr;–coutstr;带空格的字符串输入–stringstr;–getline(cin,str);–coutstrendl;字符串的赋值、连接、下标访问相关操作见例string.cpp字符串的赋值–用赋值号=–用string::assign()字符串连接–用运算符+=、+–用string::append()下标访问(返回下标为i的元素)–用下标运算符[],不做边界检查,效率相对高些–用string::at,做边界检查,效率相对低些字符串的比较见例string2.cpp判断字符串相等–可以用==直接比较两个string对象–调用string::compare()比较注意compare的多种用法–result=string1.compare(string2);–result=string1.compare(2,5,string3,0,5);–result=string4.compare(0,string2.length(),string2);–result=string2.compare(0,3,string4);字符串的清空和子串的替换字符串的清空–string::erase();//保留串的内存,清空其中字符–string::clear();//清空为空串,VC6不支持子串的替换–string::replacestring练习从命令行传入若干参数,将每个参数转换为临时文件名,转换规则是临时文件的扩展名通常为temp,若原文件扩展名本就为temp,则转换成xxx例,若命令行参数为:transformprog.datmydirhello.oops.tempend.dat则输出为:–prog.dat==prog.temp–mydir==mydir.temp–hello.==hello.temp–oops.temp==oops.xxx–end.dat==end.tempVC6.0下设置命令行参数(ALT+F7)分析从命令行接收当前参数判断该参数中否包含扩展名如果没有,直接在原参数后加“temp”和“.temp”即可如有有,再判断原扩·展名是否为“temp”,是,则替换为“xxx”,否,则替换为“temp”需要用到的成员函数string::find(charc)–在串中查找字符c,若找到,返回其下标,失败,则返回string::npos–该函数返回值是string::size_type类型string::replace(size_typeidx,size_typelen,constchar*cstr)–从串中下标为idx处,将长度为len的子串替换为cstrstring::substr(size_typeidx,size_typelen)–返回串中下标为idx处,长度为len的子串–若缺少参数len,则返回从下标idx开始的所有字符string::nposstring类中npos定义如下–staticconstsize_tnpos=-1;–代表了size_t类型(unsignedint)的最大值,2^32-1string::npos有如下用法:–用作实参,其形参n代表元素个数,则该值表示元素个数为“asmanyaspossible”–用作实参,其形参pos代表元素位置,则该值表示剩余的所有元素–若作为函数返回值,即表示函数结果为失败‘\0’在string中和其他字符同等地位,没有特殊含义#includeiostream#includestringusingnamespacestd;intmain(intargc,char*argv[]){stringfilename,basename,extname,tempname;//定义4个空串conststringsuffix(tmp);inti;for(i=1;iargc;i++){filename=argv[i];string::size_typeidx=filename.find('.');if(idx==string::npos)//搜索失败{tempname=filename+'.'+suffix;}else{basename=filename.substr(0,idx);extname=filename.substr(idx+1);if(extname==suffix){tempname=basename+'.'+xxx;}elseif(extname.empty()){tempname=filename+suffix;}else{tempname=filename;tempname.replace(idx+1,string::npos,suffix);}}coutfilename==tempnameendl;}return0;}尽可能使用const----《effectiveC++》使用const的好处在于它允许指定一种语意上的约束——某种对象不能被修改——编译器具体来实施这种约束。通过const,你可以通知编译器和其他程序员某个值要保持不变。只要是这种情况,你就要明确地使用const,因为这样做就可以借助编译器的帮助确保这种约束不被破坏。const和指针指向const的指针const指针#includestdio.hvoidcopy_string(char*from,char*to){for(;*from!='\0';from++,to++){*to=*from;}*to='\0';}intmain(){char*a=Iamateacher.;char*b=Youareastudent.;printf(\nstringa=%s,a);printf(\nstringb=%s,b);copy_string(a,b);printf(\nresultstringa=%s,a);printf(\nresultstringb=%s,b);return0;}找错误如何改?#includestdio.hvoidcopy_string(char*from,char*to){for(;*from!='\0';from++,to++){*to=*from;}*to='\0';}intmain(){chara[]=Iamateacher.;charb[]=Youareastudent.;printf(\nstringa=%s,a);printf(\nstringb=%s,b);copy_string(a,b);printf(\nresultstringa=%s,a);printf(\nresultstringb=%s,b);return0;}为什么?建立人口信息相关档案第六次全国人口普查要求在全国范围内搜集人口资料,收集信息如下:–身份证号、姓名、性别、年龄、常住地址编程实现人口信息的相关登记工作。分析–用string完成字符串处理–其中居民的身份证号码一旦获得,永远无法更改classCitizen{public:Citizen();Citizen(conststring&sNumer,conststring&sName,conststring&sGen,inta,conststring&sAddr);voidprint()const;private:conststringNumberOfIDCard;stringname;stringgender;intage;stringaddress;};Citizen::Citizen(conststring&sNumer,conststring&sName,conststring&sGen,inta,conststring&sAddr):NumberOfIDCard(sNumer),name(sName),gender(sGen),address(sAddr){//NumberOfIDCard=sNumer;age=a;}//使用构造函数初始化表更有效率voidCitizen::print()const{cout------------------------------------endl;coutsetw(15)left身份证号码:NumberOfIDCardendl;coutsetw(15)left姓名:nameendl;coutsetw(15)left性别:genderendl;coutsetw(15)left年龄:ageendl;coutsetw(15)left常住地址:addressendl;}intmain(){Citizenc(510101198005010126,Nico,女,50,重庆市南岸区崇文路附1号);c.print();return0;}常对象和常成员常对象指数据成员值在对象的整个生命周期中不能被改变的对象,其声明格式为:–const类名对象名=初始化值;–const类名对象名(初始化值);从定义可以看出,常对象的数据成员是常数据成员常对象的初始化只能通过初始化表完成常对象不能调用普通成员函数常成员类的一个数据成员若被声明为常成员,则任何函数均不能修改其值类的一个成员函数若被声明为常成员,则该函数只能访问该类的数据成员,不能改写数据成员的值小节const用法常对象的数据成员均是常数据成员不能通过常对象访问普通成员函数常数据成员可以被常成员函数和普通成员函数访问,但不能修改常成员函数能访问常数据成员和普通数据成员,但是不能修改成员的值常成员函数中不能调用非const成员函数选做随机组句–设计classsentence,该类能随机组出一个句子。如果你能组出,想想如何押韵。参看解析C++实验教材实验3-6