《字符数组与字符串处理函数.ppt》由会员分享,可在线阅读,更多相关《字符数组与字符串处理函数.ppt(20页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第十二讲、第十二讲、字符数组与字符串处理函数字符数组与字符串处理函数下一页教学目的教学目的1 1、掌握字符数组的定义、初始化、引用、掌握字符数组的定义、初始化、引用2 2、掌握字符数组的输入与输出、掌握字符数组的输入与输出3 3、掌握字符串处理函数、掌握字符串处理函数下一页教学内容教学内容1、字符数组的定义和使用2、字符数组的初始化3、字符串的输入和输出4、字符串处理函数5、程序举例教材分析教材分析教学重点:l字符数组的输入与输出l字符串处理的算法教学难点:l字符串处理函数l字符串处理的算法12.1 字符数组的定义和使用字符数组的定义和使用字符数组定义的一般形式:字符数组定义的一般形式:字符数
2、组定义的一般形式:字符数组定义的一般形式:charchar 数组名数组名数组名数组名 数组长度数组长度数组长度数组长度;例如:例如:例如:例如:char c10;char c10;说明:说明:说明:说明:字符型和整型是通用的,因此定义也可改为字符型和整型是通用的,因此定义也可改为字符型和整型是通用的,因此定义也可改为字符型和整型是通用的,因此定义也可改为 int c10;int c10;但应注意它们占用的存储空间不同。但应注意它们占用的存储空间不同。但应注意它们占用的存储空间不同。但应注意它们占用的存储空间不同。实际应用中,可以用无符号整型数组来代替字符数组。实际应用中,可以用无符号整型数组来
3、代替字符数组。实际应用中,可以用无符号整型数组来代替字符数组。实际应用中,可以用无符号整型数组来代替字符数组。例如:例如:例如:例如:unsigned int c10;unsigned int c10;可以代替可以代替可以代替可以代替 int c10;int c10;1010个元素个元素个元素个元素占占占占1010个字个字个字个字节节节节在在在在TurboCTurboC中中中中1010个整数占个整数占个整数占个整数占2020个字节个字节个字节个字节下一页12.2 字符数组的初始化字符数组的初始化1 1 1 1、用字符常量对字符数组进行初始化用字符常量对字符数组进行初始化用字符常量对字符数组进行
4、初始化用字符常量对字符数组进行初始化例如:例如:例如:例如:char str 8=,p,r,o,g,r,a,mchar str 8=,p,r,o,g,r,a,m或:或:或:或:char str =,p,r,o,g,r,a,mchar str =,p,r,o,g,r,a,m或:或:或:或:str0=,str1=p,str2=r,str3=o,str4=g,str0=,str1=p,str2=r,str3=o,str4=g,str5=r,str6=a,str7=mstr5=r,str6=a,str7=m说明:说明:说明:说明:如果只给数组的一部分字符元素初始化,没有指定初值的元如果只给数组的一部分
5、字符元素初始化,没有指定初值的元如果只给数组的一部分字符元素初始化,没有指定初值的元如果只给数组的一部分字符元素初始化,没有指定初值的元素默认初值为空字符素默认初值为空字符素默认初值为空字符素默认初值为空字符(ASCII(ASCII码为码为码为码为0 0的字符的字符的字符的字符)。注意,。注意,。注意,。注意,空空空空字符与字符与字符与字符与空空空空格格格格字符字符字符字符(ASCII(ASCII码码码码32)32)不同。不同。不同。不同。下一页12.2 字符数组的初始化字符数组的初始化2 2 2 2、用字符的、用字符的、用字符的、用字符的ASCIIASCIIASCIIASCII码值对字符数组
6、码值对字符数组码值对字符数组码值对字符数组 进行初始化(了解)进行初始化(了解)进行初始化(了解)进行初始化(了解)例如:例如:例如:例如:char str8=112,114,111,103,114,97,109,0;char str8=112,114,111,103,114,97,109,0;3 3、用字符串、用字符串、用字符串、用字符串(用双引号括着的字符序列用双引号括着的字符序列用双引号括着的字符序列用双引号括着的字符序列)对字符数组进行初始化对字符数组进行初始化对字符数组进行初始化对字符数组进行初始化例如:例如:例如:例如:char str =“program”;char str =“
7、program”;该方式赋予数组该方式赋予数组该方式赋予数组该方式赋予数组8 8个字符个字符个字符个字符,最后一个为最后一个为最后一个为最后一个为“00”,”,而而而而char str=p,r,o,g,r,a,m;char str=p,r,o,g,r,a,m;占内存占内存占内存占内存7 7个字节。个字节。个字节。个字节。字符串结束标字符串结束标字符串结束标字符串结束标志志志志(自动加上自动加上自动加上自动加上)C C语言的字符串称又语言的字符串称又语言的字符串称又语言的字符串称又0 0字符串,即最后一元素值为字符串,即最后一元素值为字符串,即最后一元素值为字符串,即最后一元素值为0 0的字符数
8、组。的字符数组。的字符数组。的字符数组。下一页12.3 字符串的输入和输出字符串的输入和输出 调用调用调用调用scanfscanf函数时,空格和换行符都作为字符串的分隔符而不函数时,空格和换行符都作为字符串的分隔符而不函数时,空格和换行符都作为字符串的分隔符而不函数时,空格和换行符都作为字符串的分隔符而不能读入。能读入。能读入。能读入。getsgets函数读入由终端键盘输入的字符函数读入由终端键盘输入的字符函数读入由终端键盘输入的字符函数读入由终端键盘输入的字符(包括空格符包括空格符包括空格符包括空格符),直,直,直,直至读入换行符为止,但换行符并不作为串的一部分存入。至读入换行符为止,但换行
9、符并不作为串的一部分存入。至读入换行符为止,但换行符并不作为串的一部分存入。至读入换行符为止,但换行符并不作为串的一部分存入。1 1 1 1、逐个字符输入逐个字符输入逐个字符输入逐个字符输入/输出输出输出输出 (1)(1)在标准输入在标准输入在标准输入在标准输入/输出函数输出函数输出函数输出函数printfprintf和和和和scanfscanf中使用中使用中使用中使用%c%c格式描述符格式描述符格式描述符格式描述符 (2)(2)使用使用使用使用getchargetchar和和和和putcharputchar函数。函数。函数。函数。下一页P126 P126【例【例【例【例6-236-23】逐个
10、字符输入逐个字符输入逐个字符输入逐个字符输入/输出输出输出输出#include#includemain()main()int i;int i;char str10;char str10;for(i=0;i9;i+)for(i=0;i9;i+)scanf(%c,&stri);scanf(%c,&stri);stri=0;stri=0;for(i=0;i9;i+)for(i=0;i9;i+)printf(%c,stri);printf(%c,stri);12.3 字符串的输入和输出字符串的输入和输出stri=getchar();stri=getchar();putchar(stri);putcha
11、r(stri);下一页12.3 字符串的输入和输出字符串的输入和输出2 2 2 2、字符串整体输入字符串整体输入字符串整体输入字符串整体输入/输出输出输出输出(1)(1)在标准输入在标准输入在标准输入在标准输入/输出函数输出函数输出函数输出函数printfprintf和和和和scanfscanf中使用中使用中使用中使用%s%s格式描述符格式描述符格式描述符格式描述符P127 P127【例【例【例【例6-246-24】字符串整体输入字符串整体输入字符串整体输入字符串整体输入/输出输出输出输出#include#includemain()main()int i;int i;char str10;ch
12、ar str10;scanf(“%s”,str);scanf(“%s”,str);printf(“%sn”,str);printf(“%sn”,str);printf(“%6sn”,str);printf(“%6sn”,str);/*/*字符串多于字符串多于字符串多于字符串多于6 6个个个个,全部输出全部输出全部输出全部输出*/*/printf(“%-.6sn”,str);printf(“%-.6sn”,str);/*/*只输出前只输出前只输出前只输出前6 6个字符,多余不输个字符,多余不输个字符,多余不输个字符,多余不输*/*/l lstrstr为字符数组名,代表该数组的起为字符数组名,代表
13、该数组的起为字符数组名,代表该数组的起为字符数组名,代表该数组的起始地址。始地址。始地址。始地址。l l输入时,系统自动在每个字符串后输入时,系统自动在每个字符串后输入时,系统自动在每个字符串后输入时,系统自动在每个字符串后加入结束符加入结束符加入结束符加入结束符 00。l l若同时输入多个字符串,则以空格若同时输入多个字符串,则以空格若同时输入多个字符串,则以空格若同时输入多个字符串,则以空格或回车符分隔。或回车符分隔。或回车符分隔。或回车符分隔。下一页例如例如例如例如char str15,str25,str35;char str15,str25,str35;scanf(“%s%s%s”,s
14、tr1,str2,str3);scanf(“%s%s%s”,str1,str2,str3);输入数据:输入数据:输入数据:输入数据:How are youHow are you输入数据后输入数据后输入数据后输入数据后str1,str2,str3 str1,str2,str3 数组状态如下图:数组状态如下图:数组状态如下图:数组状态如下图:str1str1 str2str2 str3str3数组名具有双重功能,除了表示名称外,还表示该数组的首数组名具有双重功能,除了表示名称外,还表示该数组的首数组名具有双重功能,除了表示名称外,还表示该数组的首数组名具有双重功能,除了表示名称外,还表示该数组的首
15、地址,所以用地址,所以用地址,所以用地址,所以用scanfscanf函数不用在前面加函数不用在前面加函数不用在前面加函数不用在前面加“&”“&”;字符串只能在变;字符串只能在变;字符串只能在变;字符串只能在变量定义时初始化,不能在程序语句中赋值。量定义时初始化,不能在程序语句中赋值。量定义时初始化,不能在程序语句中赋值。量定义时初始化,不能在程序语句中赋值。H Ho oww00a ar re e00y yo ou u0012.3 字符串的输入和输出字符串的输入和输出下一页12.4 字符串处理函数字符串处理函数字符串处理函数为库函数,在程序开头应加预编译命令字符串处理函数为库函数,在程序开头应加
16、预编译命令字符串处理函数为库函数,在程序开头应加预编译命令字符串处理函数为库函数,在程序开头应加预编译命令#include#include以下函数参数中的以下函数参数中的以下函数参数中的以下函数参数中的str,str1,str2str,str1,str2均为字符均为字符均为字符均为字符数组名。数组名。数组名。数组名。(1 1)putsputs(strstr););););/*/*字符串输出函数字符串输出函数字符串输出函数字符串输出函数 put string*/*/输出指定字符串。输出指定字符串。输出指定字符串。输出指定字符串。参数可以为字符串常量。输出的字符参数可以为字符串常量。输出的字符参数
17、可以为字符串常量。输出的字符参数可以为字符串常量。输出的字符串可以包含转义字符。串可以包含转义字符。串可以包含转义字符。串可以包含转义字符。(2 2)getsgets(strstr););););/*/*字符串输入函数字符串输入函数字符串输入函数字符串输入函数 get string*/*/从终端输入一个字符串到字符数组,并返回字符数组的起从终端输入一个字符串到字符数组,并返回字符数组的起从终端输入一个字符串到字符数组,并返回字符数组的起从终端输入一个字符串到字符数组,并返回字符数组的起始地址。始地址。始地址。始地址。注意:如果输入字符串有空格,则必须用注意:如果输入字符串有空格,则必须用注意:
18、如果输入字符串有空格,则必须用注意:如果输入字符串有空格,则必须用getsgetsgetsgets而不能用而不能用而不能用而不能用scanf scanf scanf scanf!下一页12.4 字符串处理函数字符串处理函数(3 3)strcatstrcat(str1str1,str2 str2););););/*/*字符串合并函数字符串合并函数字符串合并函数字符串合并函数 string string coalitioncoalition*/*/把把把把str2str2连接到连接到连接到连接到 str1str1的后面,结果放在的后面,结果放在的后面,结果放在的后面,结果放在str1str1中中中
19、中,函数返回值为函数返回值为函数返回值为函数返回值为str1str1地址地址地址地址.例如:例如:例如:例如:char str130=“Peoples Republic of”char str130=“Peoples Republic of”;char str2=“China”char str2=“China”;printf(“%s”,strcat(str1,str2);printf(“%s”,strcat(str1,str2);输出结果:输出结果:输出结果:输出结果:Peoples Republic of ChinaPeoples Republic of China说明:说明:说明:说明:s
20、tr1str1必须足够大,连接前两个字符串后面都有一个必须足够大,连接前两个字符串后面都有一个必须足够大,连接前两个字符串后面都有一个必须足够大,连接前两个字符串后面都有一个“00”,”,连接时取消连接时取消连接时取消连接时取消str1str1后面的后面的后面的后面的“00”,只在新串最后保留一个,只在新串最后保留一个,只在新串最后保留一个,只在新串最后保留一个“00”。下一页12.4 字符串处理函数字符串处理函数(4 4)strcpy(strcpy(str1str1,str2)str2);/*/*字符串拷贝字符串拷贝字符串拷贝字符串拷贝 string copy*/string copy*/将
21、将将将str2str2复制到复制到复制到复制到str1str1中,中,中,中,实际上完成字符串的赋值操作。实际上完成字符串的赋值操作。实际上完成字符串的赋值操作。实际上完成字符串的赋值操作。说明说明说明说明:(1)(1)str1str1必须足够大;必须足够大;必须足够大;必须足够大;(2)(2)复制时连同字符串后面的复制时连同字符串后面的复制时连同字符串后面的复制时连同字符串后面的“00”一起复制到一起复制到一起复制到一起复制到str1str1中;中;中;中;(3)(3)不能用赋值语句将一个字符串常量或字符数组直接赋值给一个不能用赋值语句将一个字符串常量或字符数组直接赋值给一个不能用赋值语句将
22、一个字符串常量或字符数组直接赋值给一个不能用赋值语句将一个字符串常量或字符数组直接赋值给一个 字符数组。例如:字符数组。例如:字符数组。例如:字符数组。例如:str1=“China”str1=“China”;str1=str2str1=str2;是不合法的是不合法的是不合法的是不合法的;(4)(4)str1str1必须是数组名,必须是数组名,必须是数组名,必须是数组名,str2str2可以是字符数组名,也可以是字符串常量。可以是字符数组名,也可以是字符串常量。可以是字符数组名,也可以是字符串常量。可以是字符数组名,也可以是字符串常量。例如:例如:例如:例如:char str120char st
23、r120;char str2=“China”char str2=“China”;则则则则,strcpy(str1,str2)strcpy(str1,str2)与与与与 strcpy(str1,“China”)strcpy(str1,“China”)作用相同。作用相同。作用相同。作用相同。下一页12.4 字符串处理函数字符串处理函数(5 5)strcmpstrcmp(str1str1,str2 str2);/*/*字串比较字串比较字串比较字串比较 string compare*/string compare*/比较比较比较比较str1str1和和和和str2str2,若两者相同,返回函数值为,若
24、两者相同,返回函数值为,若两者相同,返回函数值为,若两者相同,返回函数值为0 0;若;若;若;若str1str1大大大大于于于于str2str2,返回函数值为一个正整数;,返回函数值为一个正整数;,返回函数值为一个正整数;,返回函数值为一个正整数;若若若若str1str1小于小于小于小于str2str2,返回函返回函返回函返回函数值为一个负整数。数值为一个负整数。数值为一个负整数。数值为一个负整数。说明:说明:说明:说明:对两个字符串自左至右逐个字符比较对两个字符串自左至右逐个字符比较对两个字符串自左至右逐个字符比较对两个字符串自左至右逐个字符比较(按按按按ASCIIASCII码值大小码值大小
25、码值大小码值大小比较比较比较比较),知道出现不同的字符或遇到,知道出现不同的字符或遇到,知道出现不同的字符或遇到,知道出现不同的字符或遇到“00”为止。如果,全部为止。如果,全部为止。如果,全部为止。如果,全部字符相同,则认为相等;如果出现不相同的字符,则以第一字符相同,则认为相等;如果出现不相同的字符,则以第一字符相同,则认为相等;如果出现不相同的字符,则以第一字符相同,则认为相等;如果出现不相同的字符,则以第一个不相同的字符为依据确定字符串的大小。个不相同的字符为依据确定字符串的大小。个不相同的字符为依据确定字符串的大小。个不相同的字符为依据确定字符串的大小。下一页12.4 字符串处理函数
26、字符串处理函数(6 6)strlen(str);strlen(str);/*/*字符串长度字符串长度字符串长度字符串长度 string length*/string length*/函数值为字符串实际长度,不包括函数值为字符串实际长度,不包括函数值为字符串实际长度,不包括函数值为字符串实际长度,不包括“00”。例如:例如:例如:例如:char str=“China”char str=“China”;printf(“%d”,strlen(str);printf(“%d”,strlen(str);输出结果输出结果输出结果输出结果5 5(7 7)strlwr(str);strlwr(str);/*/
27、*字符串大写转小写字符串大写转小写字符串大写转小写字符串大写转小写 string lowercase*/string lowercase*/把把把把strstr中的大写字母转换成小写字母,并存入中的大写字母转换成小写字母,并存入中的大写字母转换成小写字母,并存入中的大写字母转换成小写字母,并存入strstr。strstr必必必必须为字符数组,不能是字符串常量。须为字符数组,不能是字符串常量。须为字符数组,不能是字符串常量。须为字符数组,不能是字符串常量。(8 8)strupr(strupr(strstr););/*/*字符串小写转大写字符串小写转大写字符串小写转大写字符串小写转大写 strin
28、g string uppercase*/uppercase*/把把把把strstr中小写字母转换成大写字母中小写字母转换成大写字母中小写字母转换成大写字母中小写字母转换成大写字母,并存入并存入并存入并存入strstr。strstr必须必须必须必须为字符数组,不能是字符串常量。为字符数组,不能是字符串常量。为字符数组,不能是字符串常量。为字符数组,不能是字符串常量。char s6=CHINA;char s6=CHINA;printf(%s,strlwr(s);/printf(%s,strlwr(s);/正确正确正确正确 printf(%s,strlwr(CHINA);/printf(%s,str
29、lwr(CHINA);/错误错误错误错误 为什么为什么为什么为什么?下一页12.4 字符串处理函数字符串处理函数 P130 P130【例【例【例【例6-266-26】.将字符数组中的字符串按逆序存放后输出将字符数组中的字符串按逆序存放后输出将字符数组中的字符串按逆序存放后输出将字符数组中的字符串按逆序存放后输出#include#include#include#includemain()main()int i,j;int i,j;char t,ch80;char t,ch80;gets(ch);gets(ch);/*/*等待用户从键盘输入一个字符串等待用户从键盘输入一个字符串等待用户从键盘输入一
30、个字符串等待用户从键盘输入一个字符串*/*/puts(ch);puts(ch);/*/*显示字符串显示字符串显示字符串显示字符串*/*/for(i=0,j=strlen(ch)-1;ij;i+,j-)for(i=0,j=strlen(ch)-1;ij;i+,j-)/*/*字符串逆序处理字符串逆序处理字符串逆序处理字符串逆序处理*/*/t=chi;chi=chj;chj=t;t=chi;chi=chj;chj=t;puts(ch);puts(ch);/*/*显示字符串显示字符串显示字符串显示字符串*/*/下一页12.5 程序举例程序举例 例例例例1 1 统计输入字符串中字符统计输入字符串中字符统
31、计输入字符串中字符统计输入字符串中字符“x”“x”出现的次数出现的次数出现的次数出现的次数.#include#include#include#includeint main()int main()char str100;char str100;int n=0,i=0;int n=0,i=0;gets(str);gets(str);/*/*等待用户从键盘输入一个字符串等待用户从键盘输入一个字符串等待用户从键盘输入一个字符串等待用户从键盘输入一个字符串*/*/while(stri!=0)while(stri!=0)/*/*统计统计统计统计xx在在在在strstr中出现的次数中出现的次数中出现的次数
32、中出现的次数*/*/if(stri+=x)n+;if(stri+=x)n+;printf(“printf(“字符字符字符字符x x出现的次数是出现的次数是出现的次数是出现的次数是%dn,n);%dn,n);if(stri=x)n+;if(stri=x)n+;i+;i+;下一页12.5 程序举例程序举例 例例例例2 2 从键盘输入从键盘输入从键盘输入从键盘输入N N个字符串个字符串个字符串个字符串(每个字符串不超过每个字符串不超过每个字符串不超过每个字符串不超过8080个字符个字符个字符个字符),然后把它们按由小到大的顺序排列并输出。然后把它们按由小到大的顺序排列并输出。然后把它们按由小到大的顺
33、序排列并输出。然后把它们按由小到大的顺序排列并输出。#define N 5#define N 5#include#include#include#include void main()void main()int i;int i;char strN80,temp80;char strN80,temp80;for(i=0;iN;i+)gets(stri);for(i=0;iN;i+)gets(stri);/*/*等待从键盘输入字符串等待从键盘输入字符串等待从键盘输入字符串等待从键盘输入字符串*/*/for(i=0;iN-1;i+)for(i=0;iN-1;i+)/*/*用比较交换法排序用比较交换
34、法排序用比较交换法排序用比较交换法排序*/*/for(j=i+1;j5;j+)for(j=i+1;j0)if(strcmp(stri,strj)0)/*/*小者交换于小者交换于小者交换于小者交换于stri*/stri*/strcpy(temp,stri);strcpy(stri,strj);strcpy(strj,temp);strcpy(temp,stri);strcpy(stri,strj);strcpy(strj,temp);printf(“printf(“排序结果排序结果排序结果排序结果:n);:n);for(i=0;i5;i+)printf(%sn,stri);for(i=0;i5;i+)printf(%sn,stri);下一页小结小结1 1、字符串的结束标记、字符串的结束标记、字符串的结束标记、字符串的结束标记002 2、字符串的输入与输出、字符串的输入与输出、字符串的输入与输出、字符串的输入与输出:gets():gets()、puts()puts()3 3、字符串处理函数、字符串处理函数、字符串处理函数、字符串处理函数:strcat(),strcpy(),strcmp(),strlen()strcat(),strcpy(),strcmp(),strlen()strlwr(),strupr()strlwr(),strupr()