(8)--C语言课件第08章字符串处理.ppt





《(8)--C语言课件第08章字符串处理.ppt》由会员分享,可在线阅读,更多相关《(8)--C语言课件第08章字符串处理.ppt(93页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第八章第八章字符串处理字符串处理C语语言言中中有有字字符符串串常常量量,但但是是并并没没有有与与之之对对应应的的字字符符串串变变量量。那那么么,在在程程序序中中如如何何存储字符串常量呢存储字符串常量呢?既既然然一一个个字字符符型型变变量量能能够够存存储储一一个个字字符符,那那么么一一个个字字符符型型数数组组就就可可以以存存储储一一串串字字符符。因因此此,C语语言言中中一一般般使使用用字字符符数数组组来来存存储储字字符串。符串。字符串的内存格式字符串的内存格式C语言规定:在内存中存储字符串常量时,需语言规定:在内存中存储字符串常量时,需在其在其末尾添加空字符末尾添加空字符0(即(即ASCII码为
2、码为0的字符)作为结束标志。的字符)作为结束标志。例如:例如:用字符数组存储字符串用字符数组存储字符串在在C语言中,一般使用语言中,一般使用字符数组字符数组来存储字符串。来存储字符串。一一个个一一维维字字符符数数组组只只能能存存储储一一个个字字符符串串;而而一个一个二维二维字符数组可以存储字符数组可以存储多个多个字符串。字符串。可以通过可以通过初始化初始化将字符串存入字符数组中。将字符串存入字符数组中。字符数组的初始化字符数组的初始化1以以字符形式字符形式初始化字符数组初始化字符数组例如:例如:chars10=G,o,o,d;此时,多余的数组元素自动初始化为空字符此时,多余的数组元素自动初始化
3、为空字符0。2以以字符串形式字符串形式初始化字符数组初始化字符数组例如:例如:chars15=Goodbye;chart315=Hello,Howareyou,Goodbye;注意:注意:以下赋值是错误的以下赋值是错误的chars20;s=Goodbye;/*错误错误*/因为因为数组名数组名s是指针常量是指针常量,因此,因此不能对不能对s进行进行赋值赋值。用字符数组用字符数组引用引用字符串字符串一旦将字符串存入到一个字符数组中,就可一旦将字符串存入到一个字符数组中,就可以在程序中通过该以在程序中通过该字符数组名字符数组名来引用这个来引用这个字符串。字符串。例如:例如:chart20=Goodb
4、ye;printf(%sn,t);/*输出数组输出数组t中的字符串中的字符串*/chart315=Hello,Howareyou,Goodbye;printf(%sn,t0);printf(%sn,t1);printf(%sn,t2);3.初始化时可以不指定字符数组的长度。初始化时可以不指定字符数组的长度。例如:例如:chars=G,o,o,d;数组数组s有有4个个元素,不添加元素,不添加0。chart=Good;数组数组t有有5个个元素,自动添加元素,自动添加0。(即只要是(即只要是以字符串形式以字符串形式出现在程序中,就出现在程序中,就隐含了一个空字符隐含了一个空字符0)。)。【例例8.6
5、】从键盘上输入一位数字,将其转从键盘上输入一位数字,将其转化为相应的汉字大写数字输出。化为相应的汉字大写数字输出。问题分析:问题分析:(1)为便于字符转化,可为便于字符转化,可先将先将10个汉字存入到个汉字存入到一个字符数组中一个字符数组中。(2)若将若将10个汉字作为一个字符串,存入到一个汉字作为一个字符串,存入到一个个一维字符数组一维字符数组中,中,则从其中提取某个汉字时不甚方便。则从其中提取某个汉字时不甚方便。chart21=零壹贰叁肆伍陆柒捌玖零壹贰叁肆伍陆柒捌玖;printf(%sn,t);(3)若将若将10个汉字作为个汉字作为10个字符串,存入到一个字符串,存入到一个个二维字符数组
6、二维字符数组中,操作起来就简单多了。中,操作起来就简单多了。算法设计:算法设计:(1)首先,将首先,将10个汉字存入个汉字存入到一个到一个10行行3列的二维字列的二维字符数组符数组中,中,每行存储一个每行存储一个汉字汉字。chardx103=零零,壹壹,贰贰,叁叁,肆肆,伍伍,陆陆,柒柒,捌捌,玖玖;此时,其此时,其行号行号恰好就是对应恰好就是对应的的数字数字。(2)在转化时,直接以输入的在转化时,直接以输入的数字作为行号,而对应行数字作为行号,而对应行的字符串就是要转化的大的字符串就是要转化的大写形式。写形式。源程序之一:(使用二维字符数组)源程序之一:(使用二维字符数组)#includem
7、ain()intn;chardx103=零零,壹壹,贰贰,叁叁,肆肆,伍伍,陆陆,柒柒,捌捌,玖玖;printf(请输入一位数字:请输入一位数字:n);scanf(%d,&n);puts(dxn);思考:思考:若要完成一个多位数的转化,应该如何若要完成一个多位数的转化,应该如何编程序实现呢?编程序实现呢?用字符指针引用字符串用字符指针引用字符串在在C语语言言中中,除除了了可可以以用用字字符符数数组组来来存存储储和和引引用用字字符符串串之之外外,还还可可以以使使用用字字符符指指针针来来引引用用字符串。字符串。但但前前提提是是首首先先使使得得字字符符指指针针指指向向待待引引用用的的字字符串符串。使
8、得字符指针指向一个字符串,通常有以下使得字符指针指向一个字符串,通常有以下两种方式。两种方式。1字符指针字符指针赋值方式赋值方式例如:例如:char*p;p=Howareyou!;2字符指针字符指针初始化方式初始化方式例如:例如:char*p=Howareyou!;这里的这里的赋值或初始化赋值或初始化,并不表示将,并不表示将整个字符整个字符串串存入到存入到指针变量指针变量中。中。其正确的含义是:首先将该其正确的含义是:首先将该字符串常量字符串常量存入存入到内存中的到内存中的空闲区域空闲区域中,然后再中,然后再将将该字符该字符串的串的首地址首地址赋给赋给指针变量指针变量p。因为因为p是字符指针变
9、量,因此只能存储字符的是字符指针变量,因此只能存储字符的地址值地址值。通过字符指针引用字符串通过字符指针引用字符串一旦将字符指针指向了一个字符串,就可以一旦将字符指针指向了一个字符串,就可以在程序中在程序中通过通过该该字符指针字符指针来来引用引用这个这个字符字符串串。例如:例如:#includemain()char*p;p=Howareyou!;printf(%sn,p);/*输出指针变量输出指针变量p所指向的字符串所指向的字符串*/源程序之二:(使用字符指针数组)源程序之二:(使用字符指针数组)#includemain()intn;char*dx10=零零,壹壹,贰贰,叁叁,肆肆,伍伍,陆陆
10、,柒柒,捌捌,玖玖;printf(请输入一位数字:请输入一位数字:n);scanf(%d,&n);puts(dxn);字符串的输入与输出字符串的输入与输出字符串的输入可以使用字符串的输入可以使用scanf函数或函数或gets函函数;数;字符串的输出可以使用字符串的输出可以使用printf函数或函数或puts函函数。数。用用printf函数输出字符串函数输出字符串其一般形式为:其一般形式为:printf(%s,字符串引用字符串引用)其中的字符串引用包括字符串常量、字符数其中的字符串引用包括字符串常量、字符数组名或字符指针。组名或字符指针。例如:例如:printf(%sn,Hello);该语句也可
11、写作该语句也可写作printf(Hellon);例如:例如:chara10=Hello;printf(%sn,a);/*输出项是字符输出项是字符数组名数组名*/例如:例如:char*p=Hello;printf(%sn,p);用用puts函数输出字符串函数输出字符串其一般形式为:其一般形式为:puts(字符串引用字符串引用)其中的字符串引用包括字符串常量、字符数组名或其中的字符串引用包括字符串常量、字符数组名或字符指针。字符指针。例如:例如:puts(Hello);例如:例如:chara10=Hello;puts(a);例如:例如:char*p=Hello;puts(p);用用scanf函数输
12、入字符串函数输入字符串其一般形式为:其一般形式为:scanf(%s,字符数组名字符数组名)例如:例如:#includemain()chara20;scanf(%s,a);/*输入项是字符数组名输入项是字符数组名*/printf(%sn,a);用用scanf函数输入字符串函数输入字符串该程序运行时,若键入该程序运行时,若键入“Howareyou”,则,则只输出只输出“How”。这是因为用这是因为用scanf函数输入字符串时,其中函数输入字符串时,其中不不能包含空格能包含空格。必须首先分配好存储字符串的内存空间(比必须首先分配好存储字符串的内存空间(比如定义一个字符数组),然后才能输入字如定义一个
13、字符数组),然后才能输入字符串符串。一般一般不能不能使用使用字符指针变量字符指针变量输入字符串(除非输入字符串(除非该字符指针变量已经指向了一个数组或其他该字符指针变量已经指向了一个数组或其他预先分配好的内存空间)。预先分配好的内存空间)。#includemain()char*p;scanf(%s,p);/*p是指针变量是指针变量*/printf(%sn,p);因为定义一个字符指针变量,只是因为定义一个字符指针变量,只是分配了存分配了存储一个地址的内存空间储一个地址的内存空间,而,而并未分配存储并未分配存储字符串的内存空间字符串的内存空间。因此,使用字符指针变量输入字符串是不安因此,使用字符指
14、针变量输入字符串是不安全的,有可能造成内存数据的覆盖。全的,有可能造成内存数据的覆盖。用用gets函数输入字符串函数输入字符串其一般形式为其一般形式为:gets(字符字符数组名数组名)同样地,同样地,gets函数一般不能使用字符指针变量输入函数一般不能使用字符指针变量输入字符串字符串。例如:例如:#includemain()chara80;gets(a);puts(a);该程序运行时,若键入该程序运行时,若键入“Howareyou”,则输出为,则输出为“Howareyou”。字符串处理函数字符串处理函数在程序中调用这些库函数时,需要在程序的在程序中调用这些库函数时,需要在程序的开头添加开头添加
15、#include这条预处这条预处理命令。理命令。字符串长度函数字符串长度函数strlen其调用格式为:其调用格式为:strlen(字符串引用字符串引用)该函数的功能为返回字符串的有效长度(即该函数的功能为返回字符串的有效长度(即第一个第一个0之前的字符个数)。之前的字符个数)。#include#includeintmain(void)chara100=Helloworld!;printf(%dn,sizeof(a);printf(%dn,strlen(a);printf(%dn,strlen(Hello0world!);return0;字符串复制字符串复制若有若有chars20=Hello,t
16、20;,如何才,如何才能将数组能将数组s中的字符串复制到数组中的字符串复制到数组t中呢?中呢?可以使用可以使用t=s;或或t=Hello;这样的赋值语句这样的赋值语句来实现吗?来实现吗?不可以。因为数组名不可以。因为数组名t是一个地址常量,故不是一个地址常量,故不能对其进行赋值。能对其进行赋值。实现字符串复制的一种方法是,将源字符串中实现字符串复制的一种方法是,将源字符串中的字符的字符逐个地复制逐个地复制到目标数组中。到目标数组中。【例例8.1】编程序用逐个字符复制方式,实编程序用逐个字符复制方式,实现字符串的复制。现字符串的复制。问题分析:问题分析:该方法就是从该方法就是从源字符串的第源字符
17、串的第0个字符个字符开始,通开始,通过循环将所有字符过循环将所有字符逐个复制逐个复制到目标数组中。到目标数组中。逐个字符复制方式逐个字符复制方式:s0s1s2s3s4s5s6t0t1t2t3t4t5t6MyGod0逐个字符复制方式逐个字符复制方式:s0s1s2s3s4s5s6t0t1t2t3t4t5t6MyGod0源程序:源程序:(方法之一)(方法之一)#includemain()chart100,s100;inti;gets(s);t0=s0;t1=s1;t2=s2;puts(t);源程序:(方法之一)源程序:(方法之一)#include#includemain()chart100,s100
18、;inti;gets(s);i=0;while(i=99)ti=si;i+;puts(t);源程序:(方法之一)源程序:(方法之一)#include#includemain()chart100,s100;inti;gets(s);i=0;while(i=strlen(s)-1)ti=si;i+;puts(t);源程序:(方法之一)源程序:(方法之一)#include#includemain()chart100,s100;inti;gets(s);i=0;while(i=strlen(s)ti=si;i+;puts(t);为什么循环条件不能是为什么循环条件不能是i=strlen(s)-1呢?呢?
19、源程序:源程序:(方法之二)(方法之二)#includemain()chart100,s100;inti;gets(s);i=0;while(si!=0)ti=si;i+;puts(t);源程序:(方法之二)源程序:(方法之二)#includemain()chart100,s100;inti;gets(s);i=0;while(si!=0)ti=si;i+;ti=0;puts(t);【练习练习】输入一个字符串,将其中的输入一个字符串,将其中的小写小写字母字母转化为转化为大写大写字母,其它字符不变。字母,其它字符不变。#includemain()chara100;inti;gets(a);for
20、(i=0;ai!=0;i+)if(ai=a&ai=z)ai=ai-32;puts(a);【练习练习】输入一个字符串,将其中的输入一个字符串,将其中的小写小写字母字母转化为转化为大写大写字母,其它字符不变。字母,其它字符不变。#includemain()chara100,b100;inti;gets(a);for(i=0;ai!=0;i+)if(ai=a&ai=z)bi=ai-32;elsebi=ai;bi=0;puts(b);字符串复制函数字符串复制函数其调用格式为:其调用格式为:strcpy(字符字符数组名数组名,字符串字符串引用引用)其功能是将第二个参数所引用的字符串复制其功能是将第二个参
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 课件 08 字符串 处理

限制150内