第8讲字符串电子教案

上传人:yuzo****123 文档编号:137406415 上传时间:2020-07-08 格式:PPT 页数:49 大小:532.50KB
返回 下载 相关 举报
第8讲字符串电子教案_第1页
第1页 / 共49页
第8讲字符串电子教案_第2页
第2页 / 共49页
第8讲字符串电子教案_第3页
第3页 / 共49页
第8讲字符串电子教案_第4页
第4页 / 共49页
第8讲字符串电子教案_第5页
第5页 / 共49页
点击查看更多>>
资源描述

《第8讲字符串电子教案》由会员分享,可在线阅读,更多相关《第8讲字符串电子教案(49页珍藏版)》请在金锄头文库上搜索。

1、第8讲 字符串,C+课件,升达大学资讯系,2,字符串的概念,字符串(string)是由双引号“”所包括起来的一串文字。字符串在内存中的储存方式很特别,除了我们看到的文字外,其后还多加一个0字符,亦即空字符(NULL character)。它的ASCII值为0,作为字符串的结束标记。 特别需要注意的是:英文字母,空格和标定符号都在1个字节,而每个中文占据2个字节。而对于英文字母,空格和标定符号有两种写法,占1个字节的称为ASCII码,占两个字节的称为全角码。,升达大学资讯系,3,字符串的概念,全角码实际是缘于微软公司在远东地区的Windows本版,它使用DBCS码(双字节字符集,Double-B

2、yte Character Set)用来支持远东地区许多象形文字的表达,如中文,日文,韩文等。在这种字符集中大于128的ASCII码字符作为前导字符(而这部分字符通常不显示),并不代表实际意义,而是会自动与下一个字节结合在一起来表示一个完整的远东字符。如果把全角的字符当成一个字符输出时,通常造成输出结果被扭曲,这一点需要注意。,升达大学资讯系,4,半角与全角的输入法区别,半角,全角,参见下面的例程:,升达大学资讯系,6,运行结果,升达大学资讯系,7,C风格的字符串和标准string类型,1.字符串可以视为由字符(数据类型为char)构成的一维数组,也可以将字符串的首地址给予char指针(又称之

3、为C风格的字符串,C-style string)。因此可以有下列两种声明字符串的方式: char S120=“hello!”;/数组式的声明 char S1=“hello!”;/数组式的声明,省略维数 char *pS2=“hello!”;/指针式的声明,C风格 将字符串视为一维char数组时,可以采用逐一列出各字符的方式设定字符串的值。譬如: char S310=T,h,e, ,b,o,y; 此处的空格一定为: ,如果不慎写成(没有空格),将会造成语法错误。,升达大学资讯系,8,二维字符串数组,字符串数组实际就是一个二维字符数组。例如: char sarr321;/说明了一个包含五个字符串,

4、且每个字符串的最大长度为20的字符串数组。 与多维数组一样,字符串数组也允许进行初始化,如:char sarr321=“C+ language”,”C langguage”,”C+ is better than C”; 图例如下:,升达大学资讯系,9,升达大学资讯系,10,C风格的字符串和标准string类型,2.C风格字符串不方便的地方是,如果看作为字符组的话,必须事先确定该数组的大小,通常造成要么数组太小,不够容纳字符串的字符,要么太大,造成内存空间的浪费。对于现代的标准string类型来说,是存在这个问题,而且使用非常方便。 例如:string s1;/标准字符串 s1=“abcde”;

5、 使用string必须在头文件纳入string这个头文件,这里string可以类似于一个普通的数据类型来使用。 标准的string类型虽然好用,而实际上它是基于类和模板的,我们将在后续的课程讲述到。,升达大学资讯系,11,升达大学资讯系,12,运行结果,升达大学资讯系,13,以指针的方式定义字符串,例如:char* ps2=“hi,你好!”; 这个语句在执行的时候完成了两项工作: (1)在内存单元存入字符串“hello,你好”。 (2)将此字符串第一个字符的地址(即h的地址)存入指针ps2中。如下图所示:,升达大学资讯系,14,以指针的方式定义字符串,提示:只有字符串的双引号才可以配合字符串指

6、针的初始化使用。例如: char* pS3=“good luck!”; 或是可以分开成两个语句: char* pS3; pS3 =“good luck!”;/这里不可以理解为指针pS3的内容为字符串“good luck!”。 然而 char* pS3=b,o,y; 是错误的。,升达大学资讯系,15,字符串的输入输出,下表列出字符和字符串的输入输出设相关函数。在运用它们时,需要在程序的开头纳入头文件:,升达大学资讯系,16,字符串的输出指令,一般而言, coutxendl;/输出x的内容直接输出。 如果x是指针,则输出x的内容地址。但是上面的这个规则对于字符串指针串指针不适用(string po

7、inter)。 这是因为cout在遇到字符串的指针或字符串的起始地址时,会自动将输出改为字符串的内容,而不是将地址输出。此外,由于字符串都明显的0作为结尾,因此,只有0之前的部分会输出,其后的部分就忽略不计。,升达大学资讯系,17,字符串输输入指令,例如:char S120=“Hello,你好!”; char* pS=S1; 以下输出语句均为输出字符串的内容: “Hello,你好!” coutpS; coutS1; cout,升达大学资讯系,18,字符串的输入指令,cin可以作为字符或者字符串的标准输入通道,但其输入数据流在遇到空格或新行符号n都会停止。因此,如果要输入字符串“hello, 你

8、好!”(注意有一个空格)时,必须分两次撷取: char S120,S220; cinS1S2; 为了避免这个限制,可以使用函数cin.getline()。它的参数有三个: cin.getline(字符串名称,最大字符数,结束字符); 其中“结束字符”的默认值是n,足以对付大多数情况。,升达大学资讯系,19,字符串的输入指令,针对刚才的字符串“hello, 你好”而言,只要将语句改称以下的形式即可完成完整的输入(包括其中的空格): cin.getline(S1,20);/默认结束字符为/n,输入字符到S1 此外,函数cin.get()一次只能输入一个字符,其使用方式如下: char C1; ci

9、n.get(C1);/输入字符到C1 参见如下例程:,升达大学资讯系,20,升达大学资讯系,21,运行结果,升达大学资讯系,22,常用的字符串处理函数,对字符串的处理中,固然可以每次只处理一个字符的观点来进行字符串的各种复制、衔接、计算长度、比较等等处理。但是使用C+编译器所附设的标准字符串处理函数库可以处理更简洁、更有效率。 在使用这些标准的字符串进行处理时,需要在程序开头加入如下的头文件语句: #include;,升达大学资讯系,23,标准字符串处理函数列表,升达大学资讯系,24,关于字符串函数的一点提示,1.由于strcpy()和strcat()在处理时不会先行检查内存空间是否足够,因此

10、在使用时要特别小心,避免存储到没有声明的位置,造成执行上的错误,严重时可能导致当机。 2.此外,strcmp()比较的是两个字符串个字符的内码大小。 参见下面的例程:,升达大学资讯系,25,升达大学资讯系,26,运行结果,升达大学资讯系,27,字符串与数字的转换,字符串内容的数据是以ASCII码存储的,而数字则是以二进制的方式存储的,因此 “365”和365 所代表的意义完全不同的。数字可以进行数学运算,但字符串一般意义上是不能的。如果要将字符串与数字相互转换,可以使用C+编译器所附设的标准字符串转换函数库。 在使用这些字符串与数字转换的函数时,要纳入头文件: #include,升达大学资讯系

11、,28,标准字符串转换函数,升达大学资讯系,29,升达大学资讯系,30,运行结果,升达大学资讯系,31,字符的检查与大小写转换,有时为了将某份文件中的文字进行特殊的转换和编排工作,比如: 进行大小写的转换 将数据中的点号“,”除掉 将所有文字对齐 将所有的非数字符号除掉 将所有的段落符号除掉 等等这些工作都需要逐一进行字符的检查或者转换。这类功能可以调用C+的标准字符函数库: #include,升达大学资讯系,32,升达大学资讯系,33,升达大学资讯系,34,运行结果,升达大学资讯系,35,字符串的指针数组,如果把具有相同特征的一群字符串以指针数组来代表,常常可以让字符串的处理更加方便。如下列

12、程序:,升达大学资讯系,36,VC运行结果,升达大学资讯系,37,BCC运行结果,升达大学资讯系,38,Dec-C+运行结果,升达大学资讯系,39,为什么 没有用 static,升达大学资讯系,40,运行结果,升达大学资讯系,41,对字符串指针的一点思考,1.char* Strs1= Just, a, test ; Strs100 = 65; /这里编译没有错误,而运行时报错,为什么? coutStrs10;,升达大学资讯系,42,错误对话框,升达大学资讯系,43,对字符串指针的一点思考,2.char* Strs2 = new char*3; Strs20 = new char5; strcp

13、y(Strs20, Just); Strs21 = new char2; strcpy(Strs21, a); Strs22 = new char5; strcpy(Strs22, test); Strs200 = 65;/完全正常,为什么? cout Strs20;/输出为:,升达大学资讯系,44,答案小提示:,第一个方法实际得到的是const char*,也就是说,它定义了一个常量的指针,编译器把它放在只读存储区( read-only area ),其指向的内容不可更改。 而第二方法是放在动态分配的堆区(heap),可读可写。自然就可以改变其内容了。,升达大学资讯系,45,补充小知识:堆和

14、栈的区别,一般认为在C/C+中分为这几个存储区 1栈 - 有编译器自动分配释放 2堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收 3全局区(静态区),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静 态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束释放 4另外还有一个专门放常量的地方。 - 程序结束释放,升达大学资讯系,46,堆和栈的区别,在函数体中定义的变量通常是在栈上,用malloc, calloc, realloc(C+中为new)等分配内存的函数分配得到的就是在堆上。在所有函数体外定义的是全局量,加了stati

15、c修饰符后不管在哪里都存放在全局区(静态区),在所有函数体外定义的static变量表示在该文件中有效(这时和未命名的名称空间效果是一样的),不能extern到别的文件用,在函数体内定义的static表示只在该函数体内有效。另外函数中的“adgfdf”这样的字符串存放在常量区(这一点非常重要)。,升达大学资讯系,47,堆和栈的区别,比如:int a = 0; /全局初始化区 char *p1; /全局未初始化区 main() int b; /栈 char s = abc;/栈 char *p2;/ 栈 char *p3 = 123456; /1234560在常量区,p3在栈上。 static i

16、nt c =0;/ 全局(静态)初始化区 p1 = (char *)malloc(10); p2 = (char *)new(20);/分配得来得10和20字节的区域就在堆区。 strcpy(p1, 123456); /1234560放在常量区,编译器可能会将它与p3所指向的123456优化成一块。,升达大学资讯系,48,堆和栈的区别,并且频繁地malloc和free会产生内存碎片(有点类似磁盘碎片),因为C/C+分配动态内存时是寻找匹配的内存的。而用栈则不会产生碎片。 在栈上存取数据比通过指针在堆上存取数据快些。 一般大家说的堆栈和栈是一样的,就是栈(stack),而说堆时才是堆heap. 栈是先入后出的,一般是由高地址向低地址生长。而堆恰好相反。,升达大学资讯系,49,堆和栈的区别,还有就是函数调用时会在栈上有一系列的保留现场及传递参数的操作。 栈的空间大小有限定,VC的缺省是2M。栈不够用的情况一般是程序中分配了大量数组和

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 教学课件 > 高中课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号