程序设计与算法之字符串

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

程序设计与算法(一)李文新郭炜信息科学技术学院1字符串信息科学技术学院《程序设计与算法》2C++中的字符串字符串有三种形式。1.用双引号括起来的字符串常量,如CHINA,C++program。2.存放于字符数组中,以‘\0’字符(ASCII码为0)结尾3.string对象。string是C++标准模板库里的一个类,专门用于处理字符串(略)。3字符串常量字符串常量占据内存的字节数等于字符串中字符数目加1,多出来的是结尾字符‘\0’。字符串Cprogram在内存中的布局:4Cprogram\0字符串的长度不包含’\0’字符串常量也是合法的字符串常量,称为“空串”,空串仍然会占据一个字节的存储空间,存放‘\0’。如果字符串常量中包含双引号,则双引号应写为‘\’。而‘\’字符在字符串中出现时,须连写两次,变成‘\\’。例如:coutHesaid:\Iamastu\\dent.\;=Hesaid:Iamastu\dent.5用一维char数组存放字符串包含‘\0’字符的一维char数组,就是一个字符串。其中存放的字符串即为‘\0’前面的字符组成。用char数组存放字符串,数组元素个数应该至少为字符串长度+1char数组的内容,可以在初始化时设定,也可以用C++库函数进行修改,还可以用对数组元素赋值的办法任意改变其中的某个字符。字符数组同样可以用cout、printf输出,用cin、scanf读入。用cin、scanf将字符串读入字符数组时,会自动在字符数组中字符串的末尾加上‘\0’6字符串程序示例#includeiostream#includecstring//包含字符串库函数的声明usingnamespacestd;intmain(){chartitle[]=PrisonBreak;//title最后一个元素是'\0'charhero[100]=MichaelScofield;charprisonName[100];charresponse[100];coutWhat'sthenameoftheprisonintitleendl;cinprisonName;//输入字符串if(strcmp(prisonName,Fox-River)==0)//字符串比较函数coutYeah!Doyouloveheroendl;else{//字符串拷贝函数strcpy(response,Itseemsyouhaven'twatchedit!\n);coutresponse;}7PrisonBreak\0What'sthenameoftheprisoninPrisonBreak字符串程序示例title[0]='t';title[3]=0;//等效于title[3]='\0';couttitleendl;return0;}8tri\0onBreak\0字符串程序示例title[0]='t';title[3]=0;//等效于title[3]='\0';couttitleendl;return0;}9What'sthenameoftheprisoninPrisonBreakFox-River↙Yeah!DoyouloveMichaelScofieldtriWhat'sthenameoftheprisoninPrisonBreakShark↙Itseemsyouhaven'twatchedit!tri用scanf读入字符串用scanf可以将字符串读入字符数组scanf会自动添加结尾的'\0'scanf读入到空格为止charline[100];scanf(%s,line);//注意,不是&lineprintf(%s,line);10FoxRiver↙Fox用scanf读入字符串在数组长度不足的情况下,scanf可能导致数组越界charline[5];scanf(%s,line);若输入12345,则数组越界!cin输入字符串的情况和scanf相同charline[5];cinline;//若输入12345,则数组越界!11读入一行到字符数组cin.getline(charbuf[],intbufSize);读入一行(行长度不超过bufSize-1)或bufSize-1个字符到buf,自动添加'\0'回车换行符不会写入buf,但是会从输入流中去掉charline[10];cin.getline(line,sizeof(line));//或cin.getline(line,10);读入最多9个字符到linecoutline;12Abc↙AbcAbc1234567↙Abc1234读入一行到字符数组gets(charbuf[]);读入一行,自动添加'\0'回车换行符不会写入buf,但是会从输入流中去掉。可能导致数组越界!chars[10];while(gets(s)){printf(%s\n,s);}13Abc↙Abc1234↙1234^Z↙字符串库函数使用字符串函数需要#includecstring字符串函数都根据'\0'来判断字符串结尾形参为char[]类型,则实参可以是char数组或字符串常量字符串拷贝strcpy(char[]dest,char[]src);//拷贝src到dest字符串比较大小intstrcmp(char[]s1,char[]s2);//返回0则相等求字符串长度intstrlen(char[]s);//不算结尾的'\0'字符串拼接strcat(char[]s1,char[]s2);//s2拼接到s1后面字符串转成大写strupr(char[]);字符串转成小写strlwr(char[]);......14字符串库函数用法示例#includeiostream#includecstring//要使用字符串库函数需要包含此头文件usingnamespacestd;voidPrintSmall(chars1[],chars2[])//输出词典序小的字符串{if(strcmp(s1,s2)=0)//如果s1小于等于s2couts1;elsecouts2;}intmain(){chars1[30];chars2[40];chars3[100];strcpy(s1,Hello);//拷贝Hello到s1,s1=Hellostrcpy(s2,s1);//拷贝s1到s2,s2=Hellocout1)s2endl;//输出1)Hellostrcat(s1,,world);//连接,world到s1尾部。s1=Hello,worldcout2)s1endl;//输出2)Hello,world15字符串库函数用法示例cout3);PrintSmall(abc,s2);coutendl;//输出3)Hellocout4);PrintSmall(abc,aaa);coutendl;//输出4)aaaintn=strlen(s2);//求s2长度cout5)n,strlen(abc)endl;//输出5)5,3strupr(s1);//把s1变成大写,s1=HELLO,WORLDcout6)s1endl;//输出6)HELLO,WORLDreturn0;}16strlen常见糟糕用法chars[100]=test;for(inti=0;istrlen(s);++i){s[i]=s[i]+1;}strlen函数的执行是需要时间的,且时间和字符串的长度成正比每次循环,都调用strlen函数,这是效率上的很大浪费17strlen常见糟糕用法应取出s的长度存放在一个变量里面,然后在循环的时候使用该变量chars[100]=test;intlen=strlen(s);for(inti=0;ilen;++i){s[i]=s[i]+1;}或:chars[100]=test;for(inti=0;s[i];++i){s[i]=s[i]+1;}18例题:编写判断子串的函数编写一个函数:intStrstr(chars1[],chars2[]);如果s2不是s1的字串,返回-1如果s2是s1的子串,返回其在s1中第一次出现的位置空串是任何串的子串,且出现位置为019例题:编写判断子串的函数intStrstr(chars1[],chars2[]){if(s2[0]==0)return0;for(inti=0;s1[i];++i){//枚举比较起点intk=i,j=0;for(;s2[j];++j,++k){if(s1[k]!=s2[j])break;}if(s2[j]==0)returni;}return-1;}20

1 / 20
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功