《第08章 字符串.ppt》由会员分享,可在线阅读,更多相关《第08章 字符串.ppt(38页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第第第8 8章章章章 字符串字符串字符串字符串知识是一种积累,而不是一种冲动知识是一种积累,而不是一种冲动2教学目标教学目标理解字符串常量理解字符串常量理解字符数组和字符串的异同理解字符数组和字符串的异同使用字符串输入使用字符串输入/输出函数输出函数使用字符串处理函数使用字符串处理函数理解指针与字符串的关系理解指针与字符串的关系使用字符指针数组使用字符指针数组使用字符串作为函数参数使用字符串作为函数参数知识是一种积累,而不是一种冲动知识是一种积累,而不是一种冲动3字符串简介字符串简介char a=W;char b=a;char c=n;char d=g;char e=L;char f=i;如
2、何让程序存储我的姓名?如何让程序存储我的姓名?Wang LiChar n=W,a,n,g,L,i;用若干个字符用若干个字符用字符数组用字符数组用字符串用字符串知识是一种积累,而不是一种冲动知识是一种积累,而不是一种冲动4字符串常量字符串常量字符串常量是字符串常量是双引号双引号括起的任意字符序列括起的任意字符序列Hello WorldWangPingPlease enter your full name:Hello UPC字符串常量中可包含字符串常量中可包含转义序列转义序列HelloWorld0字符串结束符字符串结束符知识是一种积累,而不是一种冲动知识是一种积累,而不是一种冲动5字符串与字符数组
3、字符串与字符数组语言中没有专门的字符串变量,通常用一个字符数组语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串来存放一个字符串字符串字符串一串以一串以00结尾的字符在结尾的字符在C C语言中被看作字符串语言中被看作字符串用双引号括起的一串字符是字符串常量,用双引号括起的一串字符是字符串常量,C C语言语言自动为其添加自动为其添加00终结符终结符C C语言并没有为字符串提供任何专门的表示法,完全使用字符数语言并没有为字符串提供任何专门的表示法,完全使用字符数组和字符指针来处理组和字符指针来处理字符数组字符数组每个元素都是字符类型的数组,如每个元素都是字符类型的数组,如char na
4、me20;char name20;字符数组和字符串的区别是:字符串的末尾有一个空字字符数组和字符串的区别是:字符串的末尾有一个空字符符0知识是一种积累,而不是一种冲动知识是一种积累,而不是一种冲动6一维字符数组的初始化一维字符数组的初始化字符串可按如下方式声明并初始化:字符串可按如下方式声明并初始化:1.用字符型数据对数组进行初始化用字符型数据对数组进行初始化 char name15=W,a,n,g,L,i,0;2.用字符串常量直接对数组初始化用字符串常量直接对数组初始化 char name15=WangLi;char password=12345678;手工加入一个空字符手工加入一个空字符系
5、统将自动加入一个空字符系统将自动加入一个空字符省略数组大小,系统自动计算,大小为后面的字符省略数组大小,系统自动计算,大小为后面的字符总数加总数加1,最后一个元素存入一个空字符。,最后一个元素存入一个空字符。知识是一种积累,而不是一种冲动知识是一种积累,而不是一种冲动7一维字符数组的初始化一维字符数组的初始化 问题:问题:char ch6=123456;char ch6=1234567;char ch6=123;输出数组元素的结果是什么?输出数组元素的结果是什么?知识是一种积累,而不是一种冲动知识是一种积累,而不是一种冲动8一维字符数组举例一维字符数组举例统计统计字符串中每个字符出现的次数。字
6、符串中每个字符出现的次数。基本思路基本思路:开一个:开一个“统计数组统计数组”记录每个字符出现的次数。记录每个字符出现的次数。关键关键:每个字符与数组中进行计数的元素之间的对应关系。:每个字符与数组中进行计数的元素之间的对应关系。方法方法:根据:根据ASCIIASCII码的性质,将字符作为统计数组中元素的码的性质,将字符作为统计数组中元素的下标。下标。int int cnt128cnt128;知识是一种积累,而不是一种冲动知识是一种积累,而不是一种冲动9一维字符数组举例一维字符数组举例#include#define N 128 int cntN;/*统计数组,初始化时全为统计数组,初始化时全为
7、 0*/void main()char line200;int k=0;puts(Enter String:);gets(line);while(linek!=0)/*对字符进行统计对字符进行统计*/cnt line k+;/*将字符作为下标将字符作为下标*/for(k=0;k0)printf(%c=%dt,k,cntk);知识是一种积累,而不是一种冲动知识是一种积累,而不是一种冲动10一维字符数组举例一维字符数组举例输入一行字符,将其中的每个字符从小到大排列后输出。输入一行字符,将其中的每个字符从小到大排列后输出。#include void main()char s100,t;int i,j
8、,n;gets(s);n=strlen(s);for(i=0;in;i+)/*冒泡法排序冒泡法排序*/for(j=0;j sj+1)t=sj;sj=sj+1;sj+1=t;puts(s);知识是一种积累,而不是一种冲动知识是一种积累,而不是一种冲动11二维字符数组二维字符数组二维字符数组的定义和初始化二维字符数组的定义和初始化可将二维数组当作一维数组使用,这个一维数组中的可将二维数组当作一维数组使用,这个一维数组中的每个元素是个一维数组。每个元素是个一维数组。char a38=str1,str2,string3;char b 6=s1,st2,str3;char a23,b35;str1str
9、200string30000000a0a00a1a2数组数组a初始化后的存储情况初始化后的存储情况知识是一种积累,而不是一种冲动知识是一种积累,而不是一种冲动12二维字符数组二维字符数组二维字符数组的引用二维字符数组的引用for(i=0;i2;i+)puts(%s,ai);/*输出输出i行字符串行字符串*/for(i=0;i2;i+)printf(%cn,aii);/*输出输出i行行i列字符列字符*/for(i=0;i2;i+)printf(%sn,&aii+1);/*输出输出i行行i+1列字符列字符 开始的字符串开始的字符串*/char a23,b35;知识是一种积累,而不是一种冲动知识是一
10、种积累,而不是一种冲动13二维字符数组举例二维字符数组举例例:输入英文的星期几,确定对应的数字。例:输入英文的星期几,确定对应的数字。可以查星期表,若发现与表中某项相同(英文的星期几),可以查星期表,若发现与表中某项相同(英文的星期几),则输出该字符串在表中的位置(序号);若查到表尾仍不相同,则输出该字符串在表中的位置(序号);若查到表尾仍不相同,则输出错误信息。则输出错误信息。可以建立如下星期表:可以建立如下星期表:SundayMondayTuesdayWednesdayThursdayFridaySaturdayS u n day 0M o n day 0T uesday 0W ed ne
11、sday 0T h ursday 0Friday 0S aturday 0012345601234567890123456用二维字符数组存储星期表,每行存一个字符串用二维字符数组存储星期表,每行存一个字符串知识是一种积累,而不是一种冲动知识是一种积累,而不是一种冲动14二维字符数组举例二维字符数组举例#include void main()int i,k;char id10;char day 10=Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday;puts(Enter a string:);scanf(%s,id);for(i=0
12、;i7;i+)for(k=0;idk!=0;k+)if(dayik=idk)continue;else break;if(idk=0)break;if (i7)printf(%s is%dn,id,i);else puts(Error!);知识是一种积累,而不是一种冲动知识是一种积累,而不是一种冲动15字符串的输入输出字符串的输入输出对于字符串(字符数组),在程序中既可逐个引用对于字符串(字符数组),在程序中既可逐个引用字符串中的单个字符字符串中的单个字符(数组元素数组元素),也可一次引用整个,也可一次引用整个字符串字符串(字符数组字符数组)(与数值型数组的区别与数值型数组的区别)知识是一种积
13、累,而不是一种冲动知识是一种积累,而不是一种冲动16对字符数组逐个元素输入对字符数组逐个元素输入/输出输出for(i=0;i10;i+)si=getchar();char s10;for(i=0;si!=0;i+)putchar(si);puts();知识是一种积累,而不是一种冲动知识是一种积累,而不是一种冲动17字符串字符串I/0函数函数char name10;scanf(%s,name);printf(%s,name);格式描述串中使用转换字符串格式描述串中使用转换字符串%sWang LiWang0Wang知识是一种积累,而不是一种冲动知识是一种积累,而不是一种冲动18字符串示例字符串示例
14、#include void main()char s115;char s2=A,u,d,r,e,y,0;char s3=Michael Holding;int cnt=0;puts(请向数组中输入一个姓名:请向数组中输入一个姓名:);scanf(%s,s1);puts(第第1个字符串是:个字符串是:);while(s1cnt!=0)printf(%c,s1cnt);cnt+;puts(第第2个字符串是:个字符串是:);puts(s2);puts(第第3个字符串是:个字符串是:);puts(s3);知识是一种积累,而不是一种冲动知识是一种积累,而不是一种冲动19字符串字符串I/0函数函数char
15、 name10;gets(name);puts(name);WangLi0Wang LiWang Li从键盘上读入一个完整的行,从键盘上读入一个完整的行,存入字符数组存入字符数组name。并用。并用空字符空字符0取代行尾的换行符取代行尾的换行符n。把字符数组中的字符串输出把字符数组中的字符串输出到显示器。到显示器。知识是一种积累,而不是一种冲动知识是一种积累,而不是一种冲动20字符串字符串I/0函数函数puts函数完全可由函数完全可由printf函数取代。当需按一定函数取代。当需按一定格式格式输出时,须用输出时,须用printf 函数。函数。puts(“雇员姓名是雇员姓名是:);puts(na
16、me);puts(“雇员所属部门是雇员所属部门是:);puts(dept);printf(雇员姓名是:雇员姓名是:%sn,name);printf(雇员所属部门是:雇员所属部门是:%sn,dept);使用使用puts函数输出字符串函数输出字符串使用使用printf函数输出字符串函数输出字符串知识是一种积累,而不是一种冲动知识是一种积累,而不是一种冲动21字符串示例字符串示例#include void main()char line30;int i=0,cnt=0;puts(请输入一行字符:);gets(line);while(linei!=0)if(linei=)cnt+;i+;printf(
17、其中的空格总数为%dn,cnt);C is a programming language在循环执行时,扫描整个数组以在循环执行时,扫描整个数组以统计出空格统计出空格 的数量,直到遇到的数量,直到遇到字符字符0。每次循环执行时,都会。每次循环执行时,都会更新计数器更新计数器i和和cnt。其中的空格总数为其中的空格总数为 4知识是一种积累,而不是一种冲动知识是一种积累,而不是一种冲动22字符串示例字符串示例#include void main()char name30,address30;puts(请输入您的姓名:请输入您的姓名:);gets(name);puts(请输入您的地址:请输入您的地址:
18、);gets(address);puts(您的姓名和地址是:您的姓名和地址是:);puts(name);puts(address);知识是一种积累,而不是一种冲动知识是一种积累,而不是一种冲动23scanf和和gets使用注意事项使用注意事项scanf和和gets都可给字符数组赋值,都可给字符数组赋值,scanf不能读入带空格的不能读入带空格的字符串字符串,gets可以。可以。但是但是scanf和和gets两种用法都不安全,当用户输入的字符个两种用法都不安全,当用户输入的字符个数多于字符数组的维数时,数组将产生越界。数多于字符数组的维数时,数组将产生越界。scanf被公认为最易遭到黑客攻击的函
19、数之一被公认为最易遭到黑客攻击的函数之一gets也没有提供限制输入字符串长度的方法,容易引起缓冲也没有提供限制输入字符串长度的方法,容易引起缓冲区溢出,给黑客攻击以可乘之机区溢出,给黑客攻击以可乘之机 对输入字符串长度有限制的函数调用对输入字符串长度有限制的函数调用fgets(buf,sizeof(buf),stdin);知识是一种积累,而不是一种冲动知识是一种积累,而不是一种冲动24字符串处理函数字符串处理函数q与字符串有关的内置函数在头文件与字符串有关的内置函数在头文件string.h中定义中定义q要使用标准库字符串处理函数,程序前应该包含:要使用标准库字符串处理函数,程序前应该包含:#i
20、nclude string.hstrlenstrcpystrcmpstrcat知识是一种积累,而不是一种冲动知识是一种积累,而不是一种冲动25字符串的长度字符串的长度字符串的长度是字符串中位于结束标识字符串的长度是字符串中位于结束标识00之前之前的所有字符的的所有字符的个数个数#include void main()char str=abcdefg;int i,l=0;while(strl!=0)l+;puts(Length of string:);for(i=0;il;i+)printf(%c,stri);printf(nlength=%dn,l);while(str+l!=0);a b c
21、 d ef g 0串长串长l=7l=0l=2知识是一种积累,而不是一种冲动知识是一种积累,而不是一种冲动26求字符串长度函数求字符串长度函数语法语法 strlen(s);描述描述计算字符串计算字符串s s中字符的个数,并将字符的个数作为中字符的个数,并将字符的个数作为函数的返回值。在计算字符个数时不计表示字符串函数的返回值。在计算字符个数时不计表示字符串结束的空字符结束的空字符00。strlen#include#include void main()char s=Beijing;int l1,l2;l1=strlen(s);l2=strlen(Shanghai);printf(nstring=
22、%s,length=%d,s,l1);printf(nstring=%s,length=%dn,Shanghai,l2);string=Beijing,length=7 string=Shanghai,length=8知识是一种积累,而不是一种冲动知识是一种积累,而不是一种冲动27字符串复制字符串复制将字符串将字符串s1拷贝到串拷贝到串s2中。中。根据字符串中根据字符串中0的位置,只对的位置,只对0前面的字符进行复制。前面的字符进行复制。#include void main()char s1100,s2100;int i;puts(Enter string 1:);gets(s1);for(i
23、=0;(s2i=s1i)!=0;i+);printf(Output string 2=%sn,s2);ab.f g 0ab.f g 0s1s2.知识是一种积累,而不是一种冲动知识是一种积累,而不是一种冲动语法语法 strcpy(dest,src)描述描述其中,其中,destdest是目标字符串,是目标字符串,srcsrc是源字符串。相当于把是源字符串。相当于把字符数组字符数组srcsrc中的字符串拷贝到字符数组中的字符串拷贝到字符数组destdest中。结束中。结束标志标志00也一同拷贝。也一同拷贝。srcsrc可以是一个字符串常量。字可以是一个字符串常量。字符数组符数组destdest应足够
24、大,以保证字符串复制不越界。应足够大,以保证字符串复制不越界。28字符串复制函数字符串复制函数strcpy#include#include void main()char s=We change lives;char d20;strcpy(d,s);printf(源字符串源字符串=%sn,s);printf(目标字符串目标字符串=%sn,d);源字符串源字符串=We change lives 目标字符串目标字符串=We change lives字符串不能直接整体复制,字符串不能直接整体复制,必须借助必须借助strcpy!知识是一种积累,而不是一种冲动知识是一种积累,而不是一种冲动29字符串比较
25、函数字符串比较函数语法语法strcmp(str1,str2)描述描述按照按照ASCIIASCII码顺序码顺序比较字符串比较字符串str1str1和和str2str2的大小,的大小,比较的结果由函数返回。在两个字符串比较的结果由函数返回。在两个字符串str1str1和和str2str2相同时返回相同时返回0 0;字符串;字符串str1str1大于字符串大于字符串str2str2时返回时返回一个正值,否则就返回负值。一个正值,否则就返回负值。strcmp#include#include void main()char user 15,pwd15;puts(请输入用户名:请输入用户名:);gets(
26、user);puts(请输入密码:请输入密码:);gets(pwd);if(strcmp(user,John)=0)&(strcmp(pwd,123456)=0)puts(您已成功登录您已成功登录);else puts(用户名和用户名和/或密码无效或密码无效);请输入用户名:请输入用户名:john 请输入密码:请输入密码:123456 用户名和用户名和/或密码无效或密码无效 请输入用户名:请输入用户名:John 请输入密码:请输入密码:123456 您已成功登录您已成功登录字符串不能用关系运算符比较大小,字符串不能用关系运算符比较大小,必须借助必须借助strcmp!abc 与与 abc,相等相
27、等abcd 与与 abck,abcd 小小abc 与与 ab,abc 大大知识是一种积累,而不是一种冲动知识是一种积累,而不是一种冲动30字符串函数使用示例字符串函数使用示例从键盘任意输入从键盘任意输入5 5个学生的姓名,编程找出并输出按个学生的姓名,编程找出并输出按字典顺序排在最前面的学生姓名字典顺序排在最前面的学生姓名 等价于求最小字符串等价于求最小字符串知识是一种积累,而不是一种冲动知识是一种积累,而不是一种冲动31字符串函数使用示例字符串函数使用示例#include#include#define N 80void main()int n,num;char sN,minN;puts(Pl
28、ease enter 5 names:);gets(s);strcpy(min,s);for(n=1;n5;n+)gets(s);if(strcmp(s,min)0)strcpy(min,s);printf(The min is%sn,min);知识是一种积累,而不是一种冲动知识是一种积累,而不是一种冲动32字符串连接字符串连接将串将串str2连接到串连接到串str1之后。之后。根据字符串中根据字符串中 0 的位置进行的位置进行字符串连接。字符串连接。关键关键:要用:要用str2的第的第1个字符覆盖个字符覆盖str1的串结束标记的串结束标记0。算法:算法:1 1、查找、查找str1str1的串
29、结束标记的串结束标记002 2、从、从str1str1的的00开始,将开始,将str2str2复制到复制到str1str1后面后面。0 x y.zaab c d e f g 0b c d e f g 0str2str1.知识是一种积累,而不是一种冲动知识是一种积累,而不是一种冲动33字符串连接字符串连接#include void main()char s1100,s2100;int i,j;puts(s1:);gets(s1);puts(s2:);gets(s2);for(i=0;s1i!=0;i+);/*确定确定0位置位置*/for(j=0;(s1i=s2j)!=0;i+,j+);print
30、f(s1=%sn,s1);知识是一种积累,而不是一种冲动知识是一种积累,而不是一种冲动34字符串连接函数字符串连接函数语法语法 strcat(dest,src)描述描述把字符串把字符串srcsrc中的字符串连接到字符串中的字符串连接到字符串destdest中字符串的中字符串的后面。本函数返回值是字符数组后面。本函数返回值是字符数组destdest的首地址。连接的首地址。连接后字符串的总长度将是字符串后字符串的总长度将是字符串srcsrc的长度加上字符串的长度加上字符串 destdest的长度。目标字符串的长度。目标字符串destdest的大小应的大小应足够足够存储最终存储最终的字符串。的字符串
31、。strcat#include#includevoid main()char s1=UPC;char s230=Hello ;strcat(s2,s1);printf(s1=%sn,s1);printf(s2=%sn,s2);s1=UPCs2=Hello UPC知识是一种积累,而不是一种冲动知识是一种积累,而不是一种冲动35字符串大写转小写函数字符串大写转小写函数#include#includevoid main()char s50;puts(输入一个大写字符串:输入一个大写字符串:);gets(s);printf(原始字符串为原始字符串为%sn,s);/用用strlwr()将字符串转换为小写
32、格式将字符串转换为小写格式printf(转换后的字符串为转换后的字符串为%sn,strlwr(s);知识是一种积累,而不是一种冲动知识是一种积累,而不是一种冲动36字符串反向字符串反向在字符串中将首尾字符进行对调在字符串中将首尾字符进行对调 void main()char s100,c;int i,j;puts(s:);gets(s);for(i=0;si!=0;i+);i-;for(j=0;ji;i-,j+)c=si;si=sj;sj=c;puts(s);0a b c d e f g h ij k 0sj=0i=10ak1j9b28cij=0,1,2,3,i=10,9,8,7,/*确定确定0
33、的位置的位置*/*i指向指向0之前的最后一个字符之前的最后一个字符*/*向中间逐步交换向中间逐步交换i和和j指向的字符指向的字符*/算法:当算法:当 ji时,时,逐步交换逐步交换i和和j指向指向的字符的字符知识是一种积累,而不是一种冲动知识是一种积累,而不是一种冲动37字符串处理函数字符串处理函数#include#include void main()char s=Fly like a BUTTERFLY;printf(原字符串为:原字符串为:%sn,s);/用用strrev()将字符串将字符串s进行左右反转进行左右反转printf(n反转后的字符串为:反转后的字符串为:%sn,strrev(
34、s);知识是一种积累,而不是一种冲动知识是一种积累,而不是一种冲动38总结总结字符串与字符数组的区别是字符串的末尾有一个字符串与字符数组的区别是字符串的末尾有一个空字符空字符0以标识字符串结束以标识字符串结束用用scanf语句读入字符串时不允许输入中存在空格语句读入字符串时不允许输入中存在空格gets和和puts函数分别用于字符串的输入和输出函数分别用于字符串的输入和输出在在string.h中定义了很多字符串处理函数函数,比较常用中定义了很多字符串处理函数函数,比较常用的有:的有:strcpy、strcat、strcmp和和strlen假如程序里需要一组字符串,一种常用的做法就是用一个假如程序里需要一组字符串,一种常用的做法就是用一个字符指针数组表示它们字符指针数组表示它们字符串可以作为参数,函数传递机制与数组作参数同为引字符串可以作为参数,函数传递机制与数组作参数同为引用方式用方式