13 《C语言程序设计》教案 第四章 数组3字符数组和字符串.docx
《13 《C语言程序设计》教案 第四章 数组3字符数组和字符串.docx》由会员分享,可在线阅读,更多相关《13 《C语言程序设计》教案 第四章 数组3字符数组和字符串.docx(16页珍藏版)》请在冰豆网上搜索。
13《C语言程序设计》教案第四章数组3字符数组和字符串
《C语言程序设计》课程教案表
授课题目
第四章数组(3)——字符数组和字符串
课时安排
2
授课时间
教学目的和要求
1.掌握:
几种常用的字符串处理函数
2.熟悉:
指针与数组。
教学内容
1.基本内容:
(1)几种常用的字符串处理函数
(2)指针与数组。
2.重点:
几种常用的字符串处理函数
3.难点:
指针与数组
讲课进程和时间分配
1、复习与新知识导入(5分钟)
2、字符串处理函数(45分钟)
C语言编译系统中,提供了很多有关字符串处理的库函数。
下面介绍几个常用的字符串处理函数。
使用输入、输出字符和字符串函数时,应在函数前加上头文件“stdio.h”;使用其他字符串操作函数时,则应加上头文件“string.h”。
板书:
#include
#include
(1)字符串输出函数
格式:
puts(字符串)
功能:
将一个字符串(以‘\0’为结束标志)输出到终端。
输出的字符串中可以包含转义字符。
例如:
charstr[]={“China\nBeijing”};puts(str);
输出:
China
Beijing
在输出时将字符串结束标志‘\0’转换成‘\n’,即输出完字符串后换行。
板书:
puts(str);与printf(”%s\n”,str)等价或puts(“OK!
”);与printf(“%s\n”,”OK!
”)或printf(“OK!
\n”)等价
(2)字符串输入函数
格式:
gets(字符数组)
功能:
从终端输入一个字符串(可包含空格)以回车为输入结束标志,将接受到的字符依次赋值给字符数组各个元素,并自动在字符串末尾加结束标记‘\0’。
例如:
gets(str);
注意:
用puts和gets函数只能输入或输出一个字符串,不能写成:
puts(str1,str2);或:
gets(str1,str2);说明:
字符串可以是字符数组或字符串常量。
而scanf()是以回车、空格或tab键做分隔符的。
例:
voidmain()
{
chars[100];
printf(“请输入一个字符串:
”);
gets(s);
printf(“输入的字符串是:
”);
puts(s);
}
红色改为puts(gets(s)),不影响程序运行结果。
(3)连接两个字符串函数
格式:
strcat(字符串1,字符串2)
功能:
连接两个字符串中的字符,把字符串2的字符连接到字符串1的字符后面,结果放在字符串1中,函数调用后得到一个函数值——字符串1的起始地址。
例如:
charstr1[30]={“people′srepublicof”};
charstr2[]={“china”};
printf(“%s”,strcat(str1,str2));
输出:
people′srepublicofchina
说明:
1)字符串1必须足够大,以便能容纳连接后的新字符串。
2)连接前两个字符串后面都有一个‘\0’,连接时将字符串1后面的‘\0’取消,只在新串的最后保留一个‘\0’。
思考:
以下程序是正确的charc;c=’A’+’B’;那么,下面的程序呢?
charc[10];c=”A”+”B”;是不正确的,必须用strcat()函数来连接。
(4)字符串拷贝函数strcpy
格式:
strcpy(字符数组,字符串)
功能:
将字符串拷贝到字符数组中去。
例如:
charstr1[10],str2[]={“china”};
strcpy(str1,str2);/*或strcpy(str1,“china”);*/
执行后str1的内容为:
china\0\0\0\0\0
说明:
1)字符数组必须足够大,以便能容纳被拷贝的字符串。
2)拷贝时连同字符串后面的‘\0’一起拷贝到字符数组中。
3)不能用赋值语句将一个字符串常量或字符数组直接赋给一个字符数组。
下面的用法是错误的:
str1={“china”};str1=str2;而只能用拷贝函数strcpy处理。
用赋值语句只能将一个字符赋给一个字符型变量或字符数组元素。
如下面是合法的:
chara[5],c1,c2;c1=‘A’;c2=‘B’;a[0]=‘c’;a[1]=‘h’;a[2]=‘i’;a[3]=‘n’;a[4]=‘a’;
4)可以用strcpy函数将字符串中前面若干个字符拷贝到字符数组中去。
例如:
strcpy(str1,str2,2);
将str2中前面2个字符拷贝到str1中去,然后再加一个‘\0’。
(5)字符串比较函数
格式:
strcmp(字符串1,字符串2)
功能:
比较字符串1和字符串2的大小。
说明:
按照ASCII码值大小比较,将两个字符串自左至右逐个字符比较,直到出现不同的字符或遇到‘\0’为止。
如果全部字符相同,则认为相等;如果出现不相同的字符,则以第一个不相同字符的比较结果为准。
1.字符串1==字符串2,函数值=0;
2.字符串1>字符串2,函数值>0;
3.字符串1<字符串2,函数值<0。
两个字符串的比较,不能用以下形式str1==str2或str1>str2只能用strcmp(str1,str2)>0或==0或<0来判断
(6)测试字符串长度函数
格式:
strlen(字符数组)
功能:
测试字符串长度,函数值为字符串中实际长度,不包括‘\0’。
例如:
charstr[10]={“china”};
printf(“%d”,strlen(str));
结果为:
5
(7)字符串小写函数
格式:
strlwr(字符串)
功能:
将字符串中大写字母转换成小写字母。
lwr是lowercase(小写)的缩写。
(8)字符串大写函数
格式:
strupr(字符串)
功能:
将字符串中小写字母转换成大写字母。
upr是uppercase(大写)的缩写。
(9)字符数组程序举例
1)输入一个字符串,将其中的大写字母均变成小写字母。
#include
#include
main()
{
chars[40],c;
inti=0;
printf(“输入一个字串:
”);
gets(s);
strlwr(s);
printf(“输出转换后的字串:
”);
puts(s);
}
2)从字符串中取出指定长度的子串。
#include
main()
{
chars1[40],s2[40];
inti=0,m;
printf(“\n输入要截取子串的母串:
”);
gets(s2);
printf(“\n输入要截取子串的长度:
”);
scanf(“%d”,&m);
while(i{s1[i]=s2[i];i++;}
s1[i]=‘\0';
printf(“\n输出所截取的子串:
%s”,s1);
}
3)某单位的工作证号码的最后一位是用来表示性别的,如:
M表示男,F表示女。
今输入5个人的工作证号码,请统计出其中的男女人数。
#include
#include
main()
{
inta=0,b=0,i,n;
charc,s[5][10];
printf(“输入5个人的工作证号码:
\n”);
for(i=0;i<5;i++)
{scanf(“%s”,s[i]);
n=strlen(s[i]);
c=s[i][n-1];
if(c==‘m’||c==‘M’)
a++;
else
b++;
}
printf(“男生数为%d\n女生数为%d\n”,a,b);
}
4)有三个字符串,要求找出其中最大者
分析:
有一个二维的字符数组str[3][20],大小为3×20。
即有3行20列,每一行可以容纳20个字符。
str[0]:
China\0
str[1]:
Japan\0
str[2]:
India\0
可以把str[0],str[1],str[2]看做三个一维字符数组,它们各有20个元素。
把它们如同一维数组那样进行处理。
可以用gets函数分别读入三个字符串。
经过二次比较,就可得到值最大者,把它放在一维字符数组string中。
#include
#include
main()
{
charstring[20],str[3][20];
inti;
for(i=0;i<3;i++)
gets(str[i]);/*输入3个字符串*/
if(strcmp(str[0],str[1])>0)/*用字符串比较函数*/
strcpy(string,str[0]);
else
strcpy(string,str[1]);
if(strcmp(str[2],string)>0)
strcpy(string,str[2]);
printf(“\nthelargeststringis:
%s\n”,string);
}
3、指针与数组(35分钟)
在C语言中,指针和数组的关系非常密切,引用数组元素既可以通过下标,也可以通过指针来进行。
正确地使用数组的指针来处理数组元素,能够产生高质量的目标代码。
(1)数组的指针和指向数组的指针变量
1)指向一维数组的指针
C语言中,数组名代表该数组的首地址,即数组中第一个元素的地址。
将一维数组的名字或某个数组元素的地址赋给指针变量,指针变量即指向该一维数组或数组元素。
例如:
inta[10],*p;
p=a;/*把数组的起始地址赋给指针变量p*/
p=&a[0];把a[0]元素的地址赋给指针变量p。
因为a[0]是数组第1个元素,指向数组的指针示意图如图6-6所示。
在定义指针变量时也可以赋初值,如:
inta[10];
int*p=&a[0];或:
int*p=a;
(2)通过指针引用一维数组
我们知道,p=a;和p=&a[0];是等价的,它们都是把数组a的起始地址赋给指针变量p。
同理:
p=a+i;和p=&a[i];也是等价的。
是把数组a中第i个元素a[i]的地址赋给指针变量p。
设有以下语句:
inta[10],*p;
p=a;
把p置为指向数组a的第1个元素,即p包含了a[0]的地址。
*p为a[0]的值。
如果指针p+1,则指向a的下一个元素,如图6-7所示。
图6-7指针引用一维数组元素
根据以上所述,引用一维数组元素,可以用两种方法:
①下标法,如a[i]或p[i]形式;
②指针法,如*(a+i)或*(p+i)。
所以有:
(1)p+i和a+i就是a[i]的地址,或者说,它们指向a数组的第i个元素
(2)*(p+i)或*(a+i)就是p+i或a+i所指向的数组元素,即a[i]。
例如:
*(p+5)或*(a+5)就是a[5]。
3)指向数组的指针变量也可以带下标,如p[i]与*(p+i)等价。
例:
用三种方法输出a数组的10个元素的值。
方法一:
用下标法
main()
{
inta[10]={1,2,3,4,5,6,7,8,9,10};
inti;
for(i=0;i<10;i++)
printf(″%d″,a[i]);
}
运行结果:
12345678910
方法二:
用数组名
main()
{inta[10]={1,2,3,4,5,