第8章_字符串.ppt
《第8章_字符串.ppt》由会员分享,可在线阅读,更多相关《第8章_字符串.ppt(39页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第第第8 8章章章章 字符串字符串字符串字符串知识是一种积累,而不是一种冲动知识是一种积累,而不是一种冲动教学目标教学目标理解字符串常量理解字符串常量理解字符数组和字符串的异同理解字符数组和字符串的异同使用字符串输入使用字符串输入/输出函数输出函数使用字符串处理函数使用字符串处理函数理解指针与字符串的关系理解指针与字符串的关系使用字符指针数组使用字符指针数组使用字符串作为函数参数使用字符串作为函数参数作业书作业书185的的3,4,8 实验书实验书96实验十二的实验十二的32知识是一种积累,而不是一种冲动知识是一种积累,而不是一种冲动字符串简介字符串简介char a=W;char b=a;ch
2、ar c=n;char d=g;char e=L;char f=i;如何让程序存储我的姓名?如何让程序存储我的姓名?Wang Lichar name15=W,a,n,g,L,i;用若干个字符用若干个字符用字符数组用字符数组用字符串用字符串3知识是一种积累,而不是一种冲动知识是一种积累,而不是一种冲动字符串常量字符串常量字符串常量是双引号括起的任意字符序列字符串常量是双引号括起的任意字符序列Hello WorldWangPingPlease enter your full name:Hello UPC字符串常量中可以包含转义序列字符串常量中可以包含转义序列HelloWorld0字符串结束符字符串
3、结束符4知识是一种积累,而不是一种冲动知识是一种积累,而不是一种冲动字符串与字符数组字符串与字符数组在语言中没有专门的字符串变量,通常用一个字符数在语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串组来存放一个字符串字符串字符串一串以一串以00结尾的字符在结尾的字符在C C语言中被看作字符串语言中被看作字符串用双引号括起的一串字符是字符串常量,用双引号括起的一串字符是字符串常量,C C语言自动为其添加语言自动为其添加00终结符终结符C C语言并没有为字符串提供任何专门的表示法,完全使用字符数语言并没有为字符串提供任何专门的表示法,完全使用字符数组和字符指针来处理组和字符指针来处理字
4、符数组字符数组每个元素都是字符类型的数组,如每个元素都是字符类型的数组,如 char name20;char name20;字符数组和字符串的区别是:字符串的末尾有一个空字字符数组和字符串的区别是:字符串的末尾有一个空字符符05知识是一种积累,而不是一种冲动知识是一种积累,而不是一种冲动一维字符数组的初始化一维字符数组的初始化字符串可按如下方式声明并初始化:字符串可按如下方式声明并初始化:1.用字符型数据对数组进行初始化用字符型数据对数组进行初始化 char name15=W,a,n,g,L,i,0;2.用字符串常量直接对数组初始化用字符串常量直接对数组初始化 char name15=Wang
5、Li;char password =12345678;手工加入一个空字符手工加入一个空字符系统将自动加入一个空字符系统将自动加入一个空字符省略数组大小,系统自动计算,大小为后省略数组大小,系统自动计算,大小为后面的字符总数加面的字符总数加1,最后一个元素存入一个,最后一个元素存入一个空字符。空字符。6知识是一种积累,而不是一种冲动知识是一种积累,而不是一种冲动字符串的输入输出字符串的输入输出对于字符串(字符数组),在程序中既可以逐个引用字符对于字符串(字符数组),在程序中既可以逐个引用字符串中的单个字符串中的单个字符(数组元素数组元素)也可以一次引用整个字符串也可以一次引用整个字符串(字符数组
6、字符数组)(与数值型数组的区别与数值型数组的区别)7知识是一种积累,而不是一种冲动知识是一种积累,而不是一种冲动对字符数组逐个元素输入对字符数组逐个元素输入/输出输出for(i=0;i10;i+)si=getchar();char s10;for(i=0;si!=0;i+)putchar(si);putchar(n);8知识是一种积累,而不是一种冲动知识是一种积累,而不是一种冲动字符串字符串I/0函数函数char name10;scanf(%s,name);printf(%s,name);格式描述串中使用转换字符串格式描述串中使用转换字符串%sWang LiWang0使用使用 scanf 时,
7、时,不能输入空格不能输入空格Wang9知识是一种积累,而不是一种冲动知识是一种积累,而不是一种冲动字符串示例字符串示例#includeint main(void)char s115;char s2=A,u,d,r,e,y,0;char s3=Michael Holding;int cnt=0;printf(n 请向数组中输入一个姓名:请向数组中输入一个姓名:);scanf(%s,s1);printf(n 显示字符串显示字符串 n);printf(第一个字符串是:第一个字符串是:);while(s1cnt!=0)printf(%c,s1cnt);cnt+;printf(n 第二个字符串是:第二个
8、字符串是:);printf(%s,s2);printf(n 第三个字符串是:第三个字符串是:);printf(%sn,s3);return 0;10知识是一种积累,而不是一种冲动知识是一种积累,而不是一种冲动字符串字符串I/0函数函数char name10;gets(name);puts(name);WangLi0Wang LiWang Li从键盘上读入一个完整的行,从键盘上读入一个完整的行,存入字符数组存入字符数组name。并用。并用空字符空字符0取代行尾的换行取代行尾的换行符符n。把字符数组中的字符串输出把字符数组中的字符串输出到显示器。到显示器。使用使用 gets函数函数允许输入空格允许
9、输入空格11知识是一种积累,而不是一种冲动知识是一种积累,而不是一种冲动字符串字符串I/0函数函数puts 函数完全可以由函数完全可以由 printf 函数取代。函数取代。当需要按一当需要按一定格式输出时,通常使用定格式输出时,通常使用 printf 函数。函数。printf(n 雇员姓名是雇员姓名是:);puts(name);printf(n 雇员所属部门是雇员所属部门是:);puts(dept);printf(n 雇员姓名是:雇员姓名是:%s,name);printf(n 雇员所属部门是:雇员所属部门是:%sn,dept);使用使用puts函数输出字符串函数输出字符串使用使用printf函
10、数输出字符串函数输出字符串12知识是一种积累,而不是一种冲动知识是一种积累,而不是一种冲动字符串示例字符串示例#include int main(void)char line30;int i,count=0;printf(n 请输入一行字符:n);gets(line);i=0;while(linei!=0)if(linei=)count+;i+;printf(n 其中的空格总数为%d n,count);return 0;C is a programming language在循环执行时,扫描整个数组以在循环执行时,扫描整个数组以统计出空格统计出空格 的数量,直到遇到的数量,直到遇到字符字符0。
11、每次循环执行时,都会。每次循环执行时,都会更新计数器更新计数器 i 和和 count。其中的空格总数为其中的空格总数为 413知识是一种积累,而不是一种冲动知识是一种积累,而不是一种冲动字符串示例字符串示例#includeint main(void)char name30;char address30;puts(请输入您的姓名:请输入您的姓名:);gets(name);fflush(stdin);puts(请输入您的地址:请输入您的地址:);gets(address);fflush(stdin);printf(n您的姓名和地址是:您的姓名和地址是:n);puts(name);puts(addr
12、ess);return 0;14知识是一种积累,而不是一种冲动知识是一种积累,而不是一种冲动字符数组的初始化字符数组的初始化 问题:问题:char ch6=123456;char ch6=1234567;char ch6=123;输出数组元素的结果是什么?输出数组元素的结果是什么?#include#include void main()char ch16=123456;char ch26=1234567;char ch36=123;puts(ch1);puts(ch2);puts(ch3);字符数组的初始字符数组的初始化要防止超界或化要防止超界或缺少终止符缺少终止符15知识是一种积累,而不是一
13、种冲动知识是一种积累,而不是一种冲动一维字符数组举例一维字符数组举例输入一行字符,将其中的每个字符从小到大排列后输出。输入一行字符,将其中的每个字符从小到大排列后输出。#include int main()char string 100,t;int i,j,n;gets(string);n=strlen(string);for(i=0;in;i+)/*冒泡法排序冒泡法排序*/for(j=0;j stringj+1)t=stringj;stringj=stringj+1;stringj+1=t;puts(string);return 0;16知识是一种积累,而不是一种冲动知识是一种积累,而不是一
14、种冲动二维字符数组二维字符数组二维字符数组的定义和初始化二维字符数组的定义和初始化可将二维数组当作一维数组使用,这个一维数组中的可将二维数组当作一维数组使用,这个一维数组中的每个元素是个一维数组。每个元素是个一维数组。char a38=str1,str2,string3;char b 6=s1,st2,str3;char a23,b35;str1str200string30000000a0a00a1a2数组数组a初始化后的存储情况初始化后的存储情况17知识是一种积累,而不是一种冲动知识是一种积累,而不是一种冲动二维字符数组二维字符数组二维字符数组的引用二维字符数组的引用for(i=0;i2;i
15、+)printf(%sn,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;18知识是一种积累,而不是一种冲动知识是一种积累,而不是一种冲动二维字符数组举例二维字符数组举例例:例:输入英文的星期几,确定对应的数字。输入英文的星期几,确定对应的数字。可以查星期表,若发现与表中某项相同(英文的星期几),可以查星期表,若发现与表中某项相同(英文的星期几),则
16、输出该字符串在表中的位置(序号);若查到表尾仍不相同,则输出该字符串在表中的位置(序号);若查到表尾仍不相同,则输出错误信息。则输出错误信息。可以建立如下星期表:可以建立如下星期表:SundayMondayTuesdayWednesdayThursdayFridaySaturdayS u n day 0M o n day 0T uesday 0W ed nesday 0T h ursday 0Friday 0S aturday 0012345601234567890123456用二维字符数组存储星期表,每行存一个字符串用二维字符数组存储星期表,每行存一个字符串19知识是一种积累,而不是一种冲动
17、知识是一种积累,而不是一种冲动二维字符数组举例二维字符数组举例#include int main()int i,k;char id10;char w_day 10=Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday;printf(Enter a string:);scanf(%s,id);for(i=0;i7;i+)for(k=0;idk!=0;k+)if(w_dayik=idk)continue;else break;if(idk=0)break;if (i7)printf(%s is%dn,id,i);else printf(E
18、rror!n);return 0;20知识是一种积累,而不是一种冲动知识是一种积累,而不是一种冲动scanf和和gets使用注意事项使用注意事项scanf和和gets都可以给字符数组赋值,都可以给字符数组赋值,scanf不能读入带不能读入带空格的字符串,空格的字符串,gets可以。可以。但是但是scanf和和gets两种用法都不安全,当用户输入的字符两种用法都不安全,当用户输入的字符个数多于字符数组的维数时,数组将产生越界。个数多于字符数组的维数时,数组将产生越界。scanf被公认为最易遭到黑客攻击的函数之一被公认为最易遭到黑客攻击的函数之一gets()也没有提供限制输入字符串长度的方法,容易
19、引起也没有提供限制输入字符串长度的方法,容易引起缓冲区溢出,给黑客攻击以可乘之机缓冲区溢出,给黑客攻击以可乘之机 对输入字符串长度有限制的函数调用对输入字符串长度有限制的函数调用fgets(buf,sizeof(buf),stdin);21知识是一种积累,而不是一种冲动知识是一种积累,而不是一种冲动字符串处理函数字符串处理函数q与字符串有关的内置函数在头文件与字符串有关的内置函数在头文件string.h中定义中定义q要使用标准库字符串处理函数,程序前应该包含:要使用标准库字符串处理函数,程序前应该包含:#include string.hstrlenstrcpystrcmpstrcat22知识是
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 字符串
限制150内