第13章字符串及字符串操作.ppt

上传人:本田雅阁 文档编号:2251035 上传时间:2019-03-11 格式:PPT 页数:18 大小:160.51KB
返回 下载 相关 举报
第13章字符串及字符串操作.ppt_第1页
第1页 / 共18页
第13章字符串及字符串操作.ppt_第2页
第2页 / 共18页
第13章字符串及字符串操作.ppt_第3页
第3页 / 共18页
亲,该文档总共18页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《第13章字符串及字符串操作.ppt》由会员分享,可在线阅读,更多相关《第13章字符串及字符串操作.ppt(18页珍藏版)》请在三一文库上搜索。

1、第13章 字符串及字符串操作,在各种编程语言中,字符串的地位都十分重要,C语言中并没有提供“字符串”这个特定类型,而是以特殊字符数组的形式来存储和处理字符串,这种字符数组必须以空字符0结尾,因此,也将这种特定字符数组称为C风格字符串,本章讨论字符串和字符串的一些处理函数。,13.1 C风格字符串,C风格字符串是字符数组的一种特例,这个“特”字体现在“以0(空字符,null character)结尾”,如何声明创建一个C风格字符串时,如何使用C风格字符串,这是本节要解决的问题。,13.1.1 C风格字符串的声明,首先想到的方法是声明一个字符数组,而后对其中元素初始化,不过要保证最后一个元素是空字

2、符0,即: char str=I, ,L,o,v,e, ,C,H,I,N,A,0; 还记得么?如果在数组声明时没有指定第1维的大小,编译器将根据初始化表达式执行决定数组的大小,对C风格字符串来说,这是种不错的方法,免得一个个字符去数。 上述声明方式看上去很麻烦,要一个字母一个字母地用单引号包裹起来,还要记着最末尾的空字符0,实际上,在C语言中,还提供了另一种声明C风格字符串的方法使用字符串常量,如: char str=”I Love CHINA”;,13.1.2 C风格字符串内存中的表示,上面声明的str中,C风格字符串共有12个有效字符,但却占据了13个内存空间,编写一段代码来验证这个结论,

3、见示例。 代码 C风格字符串占据的内存字节数SizeOfStr #include /*使用printf要包含的头文件*/ #include void main(void) /*主函数*/ char sz=“I Love CHINA“; /*声明一个C风格字符串*/ printf(“sz在内存中的大小为:%d“,sizeof(sz); /*输出sz占据的内存字节数*/ getch(); /*等待,按任意键继续*/ 输出结果为: sz在内存中的大小为:13,13.2 字符数组的输入输出,请注意:本节的标题没有写“C风格字符串的输入输出”,而是说“字符数组的输入输出”,实际上,C语言允许对字符数组进

4、行整体的输入输出和元素访问,并不会检查其末尾是否为空元素,在本节学习中,读者应细心体会字符数组和C风格字符串在输入输出等方面的不同。,13.2.1 字符数组可以进行整体输入输出,普通数组不能进行整体输入输出,必须以元素为单位进行,而字符数组是个例外,来看一个例子,见示例: 代码 字符串的整体输入输出StrInputOutput #include /*使用printf要包含的头文件*/ #include void main(void) /*主函数*/ char sz=“I Love CHINA“; /*声明一个C风格字符串*/ printf(“%sn“,sz); /*对字符串进行整体输出*/ p

5、rintf(“请重新输入一个字符串,不多于12个字符n“); /*提示用户重新输入一个字符串*/ scanf(“%s“,sz); /*读取新的输入*/ printf(“修改后的字符串为:%sn“,sz); /*整体输出新的字符串*/ getch(); /*等待,按任意键继续*/ 输出结果为: I Love CHINA 请重新输入一个字符串,不多于12个字符 Hello World (键盘输入) 修改后的字符串为:Hello,13.2.2 使用gets函数读入整行输入,在接收输入时,空格和随后的字符都被舍弃掉了,那有没有一种方法能将空格和随后的字符一块读入呢?有,C语言提供了gets函数,见示例

6、: 代码 使用gets函数读取一整行到字符数组中FunctionGets #include /*使用printf要包含的头文件*/ #include void main(void) /*主函数*/ char string 256; /*开辟一字符数组string*/ printf (“Insert your full Name: n“); /*提示用户输入*/ gets (string); /*使用gets函数读取输入*/ printf (“Your Name is: %sn“,string); /*输出字符串*/ getch(); /*等待,按任意键继续*/ 输出结果为: Insert yo

7、ur full Name: li kuan (键盘输入) Your Name is: li kuan,13.2.3 访问字符数组中某个元素,字符数组首先是个数组,可以借助下标访问其中的单个字符,前面提到:在一个C风格字符串内部不能出现空字符,否则会将一个C风格串截断,下面的示例验证了这一说法: 代码 访问字符数组中的某个元素StrElement #include /*使用printf要包含的头文件*/ #include void main(void) /*主函数*/ char sz=“I Love CHINA“; /*声明一个C风格字符串*/ printf(“%sn“,sz); /*对字符串进

8、行整体输出*/ sz5=0; /*将字符串中第6个元素置为空字符*/ printf(“修改后的字符串为:%sn“,sz); /*整体输出新的字符串*/ getch(); /*等待,按任意键继续*/ 输出结果为: I Love CHINA 修改后的字符串为:I Lov,13.2.4 更便捷的输出使用puts函数,调用puts()函数实现字符串的输出,其调用形式为: puts(字符数组); 该函数的功能是将字符数组起始地址开始的一个字符串(以0结束的字符序列)输出到终端,并将字符串结束标志0转化成n,自动输出一个换行符。 举个简单的例子: char sz = “InLOVE C+!“; puts(

9、sz); 输出结果: I LOVE C+!,13.3 字符串处理函数,作为一种特殊的数组,字符数组所能享受的“特殊待遇”就是允许整体输入和输出,数组操作的其他限制对字符数组同样成立,如不允许使用一个数组给另一个数组赋值,不允许整体比较两个数组,不允许对两个进行整体的算术操作,下列用法都是错误的: char x10,y10=”123456789”; x=”987654321”; /*错误*/ x=y; /*错误*/ if(x y) /*错误*/ x+=y; /*错误*/ 如果要实现这些特定的功能,必须以数组元素,此处是字符,为基本单位来实现,举例来说,编写一个函数计算字符串中字符个数的函数,如下

10、: int strlenOwn(const char* psz) /*const使得字符数组不被修改,指针psz可修改*/ int len=0; while( *(psz+) ) len+; return len; ,13.3.1 理解:数组名是常指针,在继续书写示例调用上述strlenOwn函数之前,先来理解一个重要的概念:数组名是常指针,很多教科书中说,数组名是指向数组第1个元素的指针,这种说法欠妥。对一维数组来说,这个说法成立,但对高维数组,首先要确定的是数组名这个指针是什么类型的。 抛开数组名是什么类型的值不说,如果用数组名为一个指针赋值,该指针的值等于第1个元素的地址。 先来看最简单

11、的情况: int num10=0; int *p1=num; int* p2=num+1; 此时,数组名num可看成是int型的常指针,其值为其中第1个元素的地址,使用数组名num为p1赋值时,p1指向数组中的第1个元素num0,p2指向num1。 对二维数组来说,情况略有不同: int num34=0; int* p1=num; int* p2=num+1;,13.3.2 strlen函数与size_t,strlen函数返回的是字符串的长度,即字符串中的实际字符数目,末尾的空字符不计数,返回类型为size_t,读者也许对size_t类型比较陌生,该类型定义于标准头文件stddef.h中: t

12、ypedef unsigned int size_t; 在后续章节中会对typedef进行详细介绍,此处可以理解为一种等价关系,即size_t是无符号整型unsigned int的别名。 在使用size_t类型时,有一点需要特别注意,假设变量A和B都为size_t类型,则下述关系式恒成立: A B 0 这样,不能通过将两个size_t类型变量做差来比较大小,因此,不能通过strlen函数返回的字符串长度做差比较到底哪个字符串更长一些,来看一段示例:,13.3.3 字符串复制函数strcpy,strcpy函数用于将一个C风格字符串(源串)复制给另一个C风格字符串(目的串),在使用strcpy函数

13、有一点要注意,目的字符数组和源字符数组的大小问题,避免将长串复制给短串,这会导致数组越界错误。 来看一段strcpy函数的使用范例,见: 代码 将一个字符串复制给另一个字符串StrcpySample #include /*使用printf要包含的头文件*/ #include #include void main(void) /*主函数*/ char str1256=0; /*开辟一字符数组str1*/ char str2256=0; /*开辟一字符数组str2*/ printf (“请输入第1个字符串: n“); /*提示用户输入第1个字符串*/ gets (str1); /*使用gets函数

14、读取一行输入*/ strcpy(str2,str1); /*将第1个字符串复制给第2个字符串*/ printf(“第2个字符串为:n%s“,str2); /*输出第2个字符串*/ getch(); /*等待,按任意键继续*/ ,13.3.4 字符串比较函数strcmp,strcmp函数用于对两个C风格字符串进行比较,此处的比较不是比较两个字符串的长度,而是逐个比较字符的ASCII码,举例来说,如果字符串1以字母A开头,而字符串2以B开头,则不论两个字符串长度如何,不论两个字符串后续字串是什么,字符串2“大于”字符串1成立(B的ASCII码66大于A的ASCII码65),如果打头字符相同,则比较

15、第2个字符,依此类推,如果第2个字符相同,则比较第3个字符 如果出现诸如“ABCD”和“ABCD123”这样的情况,长度长的字符串“大于”长度短的字符串。换言之,只有两个字符串长度相同、每个字符相等时,才称两个字符串相等。 对汉字来说,比较的是内码,关于汉字内码的相关介绍,感兴趣的读者可自行查阅相关资料。 strcmp函数的原型为: int strcmp(字符串1,字符串2);,13.3.5 字符串连接函数strcat,字符串连接函数的原型为: char* strcat(字符串1,字符串2); 该函数会将字符串2附在字符串1后面,这样,字符串1的长度会有所增加,返回的指针指向字符串1。读者也许

16、会有疑问:是否要求字符串1所在的字符数组有足够的内存空间来容纳字符串2。 原则上,答案为“是,字符串1所在的字符数组应有足够的内存空间来容纳字符串2”,否则会出现内存越界的错误,这和前面strcpy函数中要求目的字符串的长度要大于源字符串的长度是一回事。 实际上,即使两个条件不满足,“大部分情况下”,strcat函数和strcpy函数的执行并不会出错,这是因为变量在内存中的位置很稀疏,如果字符数组后的一块内存并没有被其他变量等占用,程序不会出错,但如果该块内存不巧已经被分配,程序可能因此而崩溃。,13.3.6 全转换为大写形式,在某些场合,要求输入一个字符串,如果是大小写无关的,问题就来了,比

17、如,在大小写无关意义下,“AB”、“ab”、“aB”、“Ab”都是等价的,这仅仅是两个字母的情况,如果字母更多,情况更复杂,在程序中去一一判断也很不现实,为此,C标准库提供了字符串处理函数strupr,用于将字符串中所有的字母都转换成大写形式,其原型为; char* strupr(字符串); 函数返回指向字符串的指针,来看一段示例:,13.3.7 链式操作,前面介绍的几个函数中,strcpy函数、strcat函数和strupr函数的返回类型均为char*型,这可以方便地进行链式操作,举个例子,中采用了下述语句先对str中的字符大写化,而后再比较其与“PASS1234”是否相同: strupr(

18、str); /*将输入的字符串转成大写形式*/ if(strcmp(str,“PASS1234“) = 0) /*如果两个字符串相等*/ 更为简洁的写法是: f(strcmp( strupr ( str ),“PASS1234“) = 0) /*如果两个字符串相等*/ ,13.4 小结,在程序设计中,字符串的使用十分广泛,本章重点介绍了C风格字符串的相关内容,C风格字符串是种特殊的一维字符数组:除存放字符串中的各个字符外,C风格字符串最后一个字符为空字符“0“。声明C风格字符串时,既可用字符串常量为其中元素初始化,又可一个元素一个元素地进行赋值。 原则上,数组不支持整体的输入输出操作,但字符数组(包括C风格字符串)不受此限制,使用scanf和printf函数可方便地对C风格字符串进行输入输出,在输入时,可使用gets函数读取一行,克服了scanf函数不能输入空格的不足。同样,puts函数也提供了更为便捷的输出方式。 为了方便C风格字符串的处理,C语言库函数提供了一些常用处理函数,这些函数的声明可以在头文件string.h中找到。本章主要介绍了最常用也最具代表性的复制函数strcpy、比较函数strcmp、连接函数strcat、大写转换函数strcat等。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1