收藏 分销(赏)

第8讲字符串.ppt

上传人:天**** 文档编号:14638549 上传时间:2026-10-23 格式:PPT 页数:49 大小:754.04KB 下载积分:10 金币
下载 相关
第8讲字符串.ppt_第1页
第1页 / 共49页
第8讲字符串.ppt_第2页
第2页 / 共49页


点击查看更多>>
资源描述
单击此处编辑母版文本样式,第二层,第三层,第四层,第五层,单击此处编辑母版标题样式,*,第8讲 字符串,C+课件,1,字符串的概念,字符串(string)是由双引号“”所包括起来的一串文字。字符串在内存中的储存方式很特别,除了我们看到的文字外,其后还多加一个0字符,亦即空字符(NULL character)。它的ASCII值为0,作为字符串的结束标记。,特别需要注意的是:英文字母,空格和标定符号都在1个字节,而每个中文占据2个字节。而对于英文字母,空格和标定符号有两种写法,占1个字节的称为ASCII码,占两个字节的称为全角码。,2,升达大学资讯系,字符串的概念,全角码实际是缘于微软公司在远东地区的Windows本版,它使用DBCS码(双字节字符集,Double-Byte Character Set)用来支持远东地区许多象形文字的表达,如中文,日文,韩文等。在这种字符集中大于128的ASCII码字符作为前导字符(而这部分字符通常不显示),并不代表实际意义,而是会自动与下一个字节结合在一起来表示一个完整的远东字符。如果把全角的字符当成一个字符输出时,通常造成输出结果被扭曲,这一点需要注意。,3,升达大学资讯系,半角与全角的输入法区别,半角,全角,参见下面的例程:,4,升达大学资讯系,5,升达大学资讯系,二维字符串数组,字符串数组实际就是一个二维字符数组。例如:,char sarr321;,/说明了一个包含五个字符串,且每个字符串的最大长度为20的字符串数组。,与多维数组一样,字符串数组也允许进行初始化,如:,char sarr321=“C+language”,”C langguage”,”C+is better than C”;,图例如下:,C,+,+,l,a,n,g,u,a,g,e,0,C,l,a,n,g,u,a,g,e,0,C,+,+,i,s,b,e,t,t,e,r,t,h,a,n,C,0,8,升达大学资讯系,9,升达大学资讯系,C风格的字符串和标准string类型,2.C风格字符串不方便的地方是,如果看作为字符组的话,必须事先确定该数组的大小,通常造成要么数组太小,不够容纳字符串的字符,要么太大,造成内存空间的浪费。对于现代的标准string类型来说,是存在这个问题,而且使用非常方便。,例如:string s1;/标准字符串,s1=“abcde”;,使用string必须在头文件纳入string这个头文件,这里string可以类似于一个普通的数据类型来使用。,标准的string类型虽然好用,而实际上它是基于类和模板的,我们将在后续的课程讲述到。,10,升达大学资讯系,11,升达大学资讯系,运行结果,12,升达大学资讯系,以指针的方式定义字符串,例如:char*ps2=“hi,你好!”;,这个语句在执行的时候完成了两项工作:,(1)在内存单元存入字符串“hello,你好”。,(2)将此字符串第一个字符的地址(即h的地址)存入指针ps2中。如下图所示:,ps2,h,你,好,i,,,0,13,升达大学资讯系,以指针的方式定义字符串,提示:只有,字符串的双引号,才可以配合字符串指针的初始化使用。例如:,char*pS3=“good luck!”;,或是可以分开成两个语句:,char*pS3;,pS3=“good luck!”;,/这里不可以理解为指针pS3的内容为字符串“good luck!”。,然而,char*pS3=b,o,y;,是错误的。,14,升达大学资讯系,字符串的输入输出,下表列出字符和字符串的输入输出设相关函数。在运用它们时,需要在程序的开头纳入头文件:,iostream标准函数或通道,功能,cout,输出函数,cin,输入函数,cin.getline,字符串输入函数,cin.get,字符输入函数,15,升达大学资讯系,字符串的输出指令,一般而言,,coutxendl;/输出x的内容直接输出。,如果x是指针,则输出x的内容地址。但是上面的这个规则对于字符串指针串指针不适用(string pointer)。,这是因为cout在遇到字符串的指针或字符串的起始地址时,会自动将输出改为字符串的内容,而不是将地址输出。此外,由于字符串都明显的0作为结尾,因此,只有0之前的部分会输出,其后的部分就忽略不计。,16,升达大学资讯系,字符串输输入指令,例如:,char S120=“Hello,你好!”;,char*pS=S1;,以下输出语句均为输出字符串的内容:“Hello,你好!”,coutpS;,coutS1;,cout,cout,如果的确想输出某个字符串的地址,需使用特殊的语法:,cout(void*)S1;,coutS1S2;,为了避免这个限制,可以使用函数cin.getline()。它的参数有三个:,cin.getline(字符串名称,最大字符数,结束字符);,其中“结束字符”的默认值是n,足以对付大多数情况。,18,升达大学资讯系,字符串的输入指令,针对刚才的字符串“hello,你好”而言,只要将语句改称以下的形式即可完成完整的输入(包括其中的空格):,cin.getline(S1,20);,/默认结束字符为/n,输入字符到S1,此外,函数cin.get()一次只能输入一个字符,其使用方式如下:,char C1;,cin.get(C1);,/输入字符到C1,参见如下例程:,19,升达大学资讯系,20,升达大学资讯系,运行结果,21,升达大学资讯系,常用的字符串处理函数,对字符串的处理中,固然可以每次只处理一个字符的观点来进行字符串的各种复制、衔接、计算长度、比较等等处理。但是使用C+编译器所附设的标准字符串处理函数库可以处理更简洁、更有效率。,在使用这些标准的字符串进行处理时,需要在程序开头加入如下的头文件语句:,#include;,22,升达大学资讯系,标准字符串处理函数列表,函数名,功能,strlen(字符串),求出不包括0的字符串长度,strcpy(字符串1,字符串2),将字符串2拷贝到字符串1内,strcat(字符串1,字符串2),将字符串2衔接到字符串1后,strcmp(字符串1,字符串2),将字符串1与字符串2比较:如果(字符串1字符串2)则输出正整数。如果(字符串1=字符串2)则输出0。,strchr(字符串,字符),寻找字符串中第一个与指定字符相同处的地址,23,升达大学资讯系,关于字符串函数的一点提示,1.由于strcpy()和strcat()在处理时不会先行检查内存空间是否足够,因此在使用时要特别小心,避免存储到没有声明的位置,造成执行上的错误,严重时可能导致当机。,2.此外,strcmp()比较的是两个字符串个字符的内码大小。,参见下面的例程:,24,升达大学资讯系,25,升达大学资讯系,运行结果,26,升达大学资讯系,字符串与数字的转换,字符串内容的数据是以ASCII码存储的,而数字则是以二进制的方式存储的,因此,“365”和365,所代表的意义完全不同的。数字可以进行数学运算,但字符串一般意义上是不能的。如果要将字符串与数字相互转换,可以使用C+编译器所附设的标准字符串转换函数库。,在使用这些字符串与数字转换的函数时,要纳入头文件:,#include,27,升达大学资讯系,标准字符串转换函数,函数名称,功能,atoi(字符串),将字符串转换成整数,遇到非数字字符时,停止转换。,atof(字符串),将字符串转成double数字,遇到非数字或小数点字符时,停止转换。,itoa(整数,字符串,基底),将整数转成以基底为进位的ASCII字符串。例如以10表示十进制。,28,升达大学资讯系,29,升达大学资讯系,运行结果,30,升达大学资讯系,字符的检查与大小写转换,有时为了将某份文件中的文字进行特殊的转换和编排工作,比如:,进行大小写的转换,将数据中的点号“,”除掉,将所有文字对齐,将所有的非数字符号除掉,将所有的段落符号除掉,等等这些工作都需要逐一进行字符的检查或者转换。这类功能可以调用C+的标准字符函数库:,#include,31,升达大学资讯系,函数,功能(假设ch为char数据),isalpha(ch),判断ch是否为英文字母,isupper(ch),判断ch是否为大写英文字母,islower(ch),判断ch是否为小写英文字母,isdigit(ch),判断ch是否为0-9的数字字符,isascii(ch),判断ch是否为ASCII码,isspace(ch),判断ch是否为空格,isprint(ch),判断ch是否为可以打印的字符或看得见的字符,iscntrl(ch),判断ch是否为控制字符,ispucnt(ch),判断ch是否为标点符号字符,toupper(ch),如果ch为小写则转换为大写,tolower(ch),如果ch为大写则转换为小写,32,升达大学资讯系,33,升达大学资讯系,运行结果,34,升达大学资讯系,字符串的指针数组,如果把具有相同特征的一群字符串以指针数组来代表,常常可以让字符串的处理更加方便。如下列程序:,35,升达大学资讯系,VC运行结果,36,升达大学资讯系,BCC运行结果,37,升达大学资讯系,Dec-C+运行结果,38,升达大学资讯系,为什么,没有用,static,39,升达大学资讯系,运行结果,40,升达大学资讯系,对字符串指针的一点思考,1.char*Strs1=,Just,a,test,;,Strs100=65;,/这里编译没有错误,而运行时报错,为什么,?,coutStrs10;,41,升达大学资讯系,错误对话框,42,升达大学资讯系,对字符串指针的一点思考,2.char*Strs2=new char*3;,Strs20=new char5;,strcpy(Strs20,Just);,Strs21=new char2;,strcpy(Strs21,a);,Strs22=new char5;,strcpy(Strs22,test);,Strs200=65;,/完全正常,为什么?,cout Strs20;,/输出为:,43,升达大学资讯系,答案小提示:,第一个方法实际得到的是const char*,也就是说,它定义了一个常量的指针,编译器把它放在只读存储区(read-only area),其指向的内容不可更改。,而第二方法是放在动态分配的堆区(heap),可读可写。自然就可以改变其内容了。,44,升达大学资讯系,补充小知识:堆和栈的区别,一般认为在C/C+中分为这几个存储区,1栈-有编译器自动分配释放,2堆-一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收,3全局区(静态区),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静,态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。,-程序结束释放,4另外还有一个专门放常量的地方。-程序结束释放,45,升达大学资讯系,堆和栈的区别,在函数体中定义的变量通常是在栈上,用malloc,calloc,realloc(C+中为new)等分配内存的函数分配得到的就是在堆上。在所有函数体外定义的是全局量,加了static修饰符后不管在哪里都存放在全局区(静态区),在所有函数体外定义的static变量表示在该文件中有效(这时和未命名的名称空间效果是一样的),不能extern到别的文件用,在函数体内定义的static表示只在该函数体内有效。另外函数中的“adgfdf”这样的字符串存放在常量区,(这一点非常重要),。,46,升达大学资讯系,堆和栈的区别,比如:int a=0;,/全局初始化区,char*p1;,/全局未初始化区,main(),int b;,/栈,char s=abc;,/栈,char*p2;,/栈,char*p3=123456;,/,1234560,在常量区,p3在栈上。,static int c=0;,/全局(静态)初始化区,p1=(char*)malloc(10);,p2=(char*)new(20);,/分配得来得10和20字节的区域就在堆区。,strcpy(p1,123456);,/1234560放在常量区,编译器可能会将它与p3所指向的123456优化成一块。,47,升达大学资讯系,堆和栈的区别,并且频繁地malloc和free会产生内存碎片(有点类似磁盘碎片),因为C/C+分配动态内存时是寻找匹配的内存的。而用栈则不会产生碎片。,在栈上存取数据比通过指针在堆上存取数据快些。,一般大家说的堆栈和栈是一样的,就是栈(stack),而说堆时才是堆heap.,栈是先入后出的,一般是由高地址向低地址生长。而堆恰好相反。,48,升达大学资讯系,堆和栈的区别,还有就是函数调用时会在栈上有一系列的保留现场及传递参数的操作。,栈的空间大小有限定,VC的缺省是2M。栈不够用的情况一般是程序中分配了大量数组和递归函数层次太深。有一点必须知道,当一个函数调用完返回后它会释放该函数中所有的栈空间。栈是由编译器自动管理的,不用用户操心。,堆是动态分配内存的,并且用户可以分配使用很大的内存。但是用不好会产生内存泄漏。,49,升达大学资讯系,
展开阅读全文

开通  VIP、SVIP  下载更划算
下载10份以上建议开通 VIP 会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        关注我们

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服