C语言程序设计第15章 字符串处理 课件教案.docx
《C语言程序设计第15章 字符串处理 课件教案.docx》由会员分享,可在线阅读,更多相关《C语言程序设计第15章 字符串处理 课件教案.docx(18页珍藏版)》请在冰豆网上搜索。
![C语言程序设计第15章 字符串处理 课件教案.docx](https://file1.bdocx.com/fileroot1/2023-2/6/3f9c5d11-ac0d-4c3b-9140-01578c8fa9f4/3f9c5d11-ac0d-4c3b-9140-01578c8fa9f41.gif)
C语言程序设计第15章字符串处理课件教案
C语言程序设计课件教案
第十五章字符串处理
教学目的
字符与字符串的长度和尺寸的区别,在此基础上让学生掌握字符数组的定义、初始化和应用,字符串与指针(字符串的常用处理函数、sizeof)。
教学要求
1.熟练掌握字符和字符串的基本语法
2.熟练掌握字符数组的定义、初始化和应用
重点和难点
1.字符和字符串
2.字符数组的定义、初始化和应用
教学支撑环境与教学资源:
1.笔记本电脑
2.VC2010
3.投影仪
教学方法
讲授法、练习法、讨论法
授课课时
6课时
教学过程
------------------------------------AM-------------------------------------
一、课程引入
存储全班同学的成绩如何实现存储学生的姓名,可以采用定义字符数组方式解决。
二、一维字符数组与字符串
复习字符和字符串常量:
1.字符常量:
用一对单引号引起来的一个字符,要求单引号里面有且仅有一个字符,在内存中以ASCII码的形式存储,占据一个字节
|---普通字符常量:
注意单引号、双引号和斜杠三个特殊字符的写法'\\''\'''\"'即必须在前面加\字符
|---转义字符常量
|---数值转义:
'\xhh':
hh表示后面跟1~2位16进制数最大为'\FF'
'\ddd':
ddd跟1~3位八进制数不能超过unsignedchar的最大值,因此最大为'\377'
|---字符转义:
'\n''\t'
2.字符串常量:
用一对双引号包含的字符,在内存中存放时,以’\0’为结束标识(\0是数值转义字符,对应的ASCII码为数值0)。
demo"china";"192.168.0.1";"richard_20_170301_"
NOTE:
1>计算字符串尺寸可以使用sizeof();
demo
printf("%d",sizeof("china\n");//占据6个字节
printf("%d",sizeof(""));//空串,只含有'\0'占据1个BYTE
printf("%d",sizeof("china\0usa\n"));//遇到第一个\0截止因此不会输出usa,但是usa还是占据内存且后面会隐含\0,占据10byte
printf("%d",sizeof("\\\"\377123\378"));//\377占据1BYTE\378不能算一个,因为越界因此算2BYTE,总共9byte
printf("%d",sizeof("\0xFF"));
2>字符串长度:
从字符串的左边开始计数,到第一个'\0'为止,且'\0'不参与计数。
demo
printf("%d",strlen("china"));//5
printf("%d",strlen(""));//0
printf("%d",strlen("china\0usa"));//5
思考:
字符串常量可以改写吗?
如何定义字符串变量从而实现字符串的改写?
------C语言中没有字符串类型,用字符数组来存放字符串,即用字符型的一维数组称为一维字符数组。
三、字符数组定义和初始化
1.传统的字符集合方式(不推荐)
charstr1[5]={'a','b',’c’,’d’,'e'};//全部赋值,
charstr2[5]={’a’,’b’,’c’};//部分元素赋值
charstr3[]={’a’,’b’,’c’,’d’,’e‘};//省略数组长度赋值
思考:
上面三个字符数组中存放的是字符串吗?
如果数组内存中没有'\0'就未存储字符串
charstr1[5]={'a','b',’c’,’d’,'e'};//不是字符串
charstr2[5]={’a’,’b’,’c’};//为赋值的元素为'\0',因此是字符串
charstr3[]={’a’,’b’,’c’,’d’,’e‘};//省略数组长度赋值,长度根据字符的个数确定,不会自动补充'\0',因此不是字符串
总结:
用字符集合的方式赋值时,养成习惯在末尾补充'\0'否则不是字符串
2.字符串字面值方式(推荐)
charch[5]="abcd";//系统会自动在后面加'\0',即ch[4]='\0'
charch[3]="abcde";//错误,超出数组的长度
charch[5]="abcde";//错误,超出数组长度
charch[]="abc";//推荐!
!
系统会自动在后面加'\0',即a[3]='\0',所以该数组的元素个数是4个。
四、字符串的存储结构和指针(重点)
1.存储结构字符串占据连续的内存单元以\0结束
demochara[]="";
2.字符串的首元素地址:
C语言中用字符串常量或一维数组的数组名表示字符串的首地址(规定)
demo
#defineARR_SIZE100
intmain(void){
chara[ARR_SIZE]="china";//画内存图和地址关系*****
printf("%X\n",a);
printf("%X\n","china");
return0;
}
3.使用指针指向一个字符串
1.可以在定义字符指针变量的同时,将存放字符串的存储单元起始地址赋值给指针变量。
char*ps1="formone";//这里是把存放字符串常量"formone"的无名存储区的首地址
//赋值给指针变量ps1,使ps1指向字符串的第一个字符f。
charstr[]="formtwo",*ps2=str;
2.通过赋值运算使指针指向一个字符串
charstr[]="fromtwo",*p2;
p2=str;//词语等价于p2=&str[0];
通过赋值语句使指针p2指向了存放字符串的字符数组str的首地址
注意:
1>指针变量指向的是字符串的首地址,字符串是另外占据存储空间的。
(画图说明)
2>字符串赋值给字符数组时,字符串就是存放字符数组的存储空间。
(画图说明)
4.输入输出的基本原则
原则:
输入和输出必须给出字符串的首地址
1>字符串的输出:
demo输出字符串常量---字符串常量本身表示字符串的首元素地址
printf("china\n");
printf("%s\n","china");
puts("china");//会自动换行
puts("");//输出换行
printf("学渣.\n");
puts和printf的区别:
puts会自动输出换行而printf不会,"推荐用puts"
demo输出存储在字符数组中的字符串
#defineARR_SIZE100
chara[ARR_SIZE]="china\n";
charb[ARR_SIZE]="";
charc[ARR_SIZE]="学渣.\n";
printf(a);//ERROR必须加"%s"
printf(b);//ERROR必须加"%s"
printf(c);//ERROR必须加"%s"
printf("%s",a);
printf("%s",b);
printf("%s",c);
puts(a);
puts(b);
puts(c);
2>字符串的输入:
scanf_s和gets
demo:
从键盘上输入字符串,并用字符数组存储
#include
#defineARR_SIZE100/*一维字符数组a的长度*/
intmain(void)
{
chara[ARR_SIZE]="";//养成赋初值的习惯,通常用空串给字符数组赋初值
printf("输入字符串(不能含有空格,长度不超过%d):
",ARR_SIZE-1);
scanf_s("%s",a);//scanf_s不能接受含有空格的字符串,否则无法接受空格后面的字符
printf("你刚才输入的字符串为:
%s\n",a);
printf("输入字符串(可以含有空格,长度不超过%d):
",ARR_SIZE-1);
gets(a);//gets可以接受含有空格的字符串,否则无法接受空格后面的字符
puts(a);
return0;
}
总结:
scanf_s:
不能完整的接收含有空格的字符串而gets可以,因此推荐用gets
printf:
输出字符串不会自动换行,因此推荐用puts
思考:
找出下面语句中的错误
chara[100]="china";
a[0]='b';
char*p=a;
*p='m';
char*q="japan";
*q='m';
---------------------------------------------------------PM-----------------------------------------------------------------
五、字符串处理(输入输出、赋值、连接、比较...)
注意:
必须包含stdio.h好string.h
1.求字符串长度函数
intstrlen(constchar*pStr)//参数:
字符串指针返回值:
长度
demo
intmain(void)
{
chara[]="abcde";
printf("%d",strlen(a));
printf("%d",strlen("llovecteacher.\n"));
printf("%d",strlen("192\0abc"));
printf("%d",strlen("192\012abc"));
return0;
}
2.字符串复制函数
char*strcpy(char*pDes,constchar*pSrc)//要确保pDes足够长,否则产生运行时错误
demo交换字符串
#defineARR_SIZE100
intmain(void)
{
chara[ARR_SIZE]="china";
charb[ARR_SIZE]="japan";
chart[ARR_SIZE]="";
strcpy(t,a);
strcpy(a,b);
strcpy(b,t);
puts(a);
puts(b);
return0;
}
思考:
找出下面程序的错误
chara[ARR_SIZE]="china";
charb[ARR_SIZE]="japan";
chart[ARR_SIZE]="";
t=a;
a=b;
b=t;
思考:
找出下面程序的错误
#include
intmain(void)
{
chara[]="usa";
charb[10]="japan";
strcpy(a,b);//a内存不足,对未知内存进行改写,产生了运行时错误
puts(b);
return0;
}
3.字符串连接函数
char*strcat(char*pDes,constchar*pSrc)//要确保pDes足够长,否则产生运行时错误
#include
#include
intmain(void)
{
chara[10]="china";
charb[10]="japan";
chars[]="GoldenGlobal";
char*p="View";
strcat(a,b);
puts(b);
strcat(s,p);
puts(s);
return0;
}
思考:
下面程序的错误
#include
#include
intmain(void)
{
chara[]="china";
charb[10]="japan";
strcat(a,b);//a内存不足,对未知内存进行改写,产生了运行时错误
puts(b);
return0;
}
4.intstrcmp(constchar*pDes,constchar*pSrc);
设这两个字符串为str1,str2,
若str1==str2,则返回零;
若str1若str1>str2,则返回正数。
比较规则:
从左向右的字符两两比较,如果相同则继续向后比较,直到遇到第一个不相同的字符就以该不同的字符作为比较的依据
#include
intmain(void)
{
chara[100]="123ac";
charb[100]="abc";
printf("%d\n",strcmp("china","japan");
printf("%d\n",strcmp("chine","chinese");
printf("%d\n",strcmp("CHINA","china"));
printf("%d\n",strcmp("张三","李四"));//不支持中文字符的大于或小于比较,仅支持中文串的等于比较
printf("%d\n",strcmp(a,b));
printf("%d\n",strcmp("australia",b));
printf("%d\n",strcmp(a"usa"));
return0;
}
5.小写字母转大写字母char*strupr(char*pStr);
#include
#include
intmain(void)
{
chars[]="Copywrite1999-2000GGVTechnologies";
charb[100]="";
puts(strupr(s);
strcpy(b,s);
puts(b);
return0;
}
6.大字母转小写字母char*strlwr(char*pStr);
#include
#include
intmain(void)
{
chars[]="Copywrite1999-2000GGVTechnologies";
charb[100]="";
puts(strlwr(s);
strcpy(b,s);
puts(b);
return0;
}
六、课后作业
练习1:
DIY库函数DIYstrcpy
demo1
char*myStrcpy1(char*pDes,constchar*pSrc)
{
if(0==pDes||0==pStr)
{
return0;
}
char*t=pDes;
while(*pStr!
='\0')
{
*pDes++=*pStr++;
}
*pDes='\0';
returnt;
}
demo2
char*myStrcpy2(char*pDes,constchar*pSrc)
{
if(0==pDes||0==pStr)
{
return0;
}
char*t=pDes,i=0;
while(pSrc[i])
{
pDes[i]=pSrc[i];
i++;
}
pDes[i]='\0';
returnt;
}
intmain(void)
{
chara[100]="china";
charb[100]="japan";
chart[100]="";
myStrcpy1(t,a);
myStrcpy1(a,b);
myStrcpy1(b,t);
puts(a);
puts(b);
}
练习2:
DIY库函数intstrcmp(constchar*pDes,constchar*pSrc)
intmyStrcmp(char*pStr1,char*pStr2)
{
if(0==pDes||0==pStr)
{
return0;
}
while(*pStr1!
=*pStr2)
{
return*pStr1-*pStr2;
}
return*pStr1-*pStr2;
}
练习3:
DIY库函数intstrlen(constchar*pStr);
intmyStrlen(char*pStr)
{
intlen=0;
if(0==pStr)
{
return-1;
}
while(*pStr)
{
len++;
pStr++;
}
returnlen;
}
intmain(void)
{
printf("%d",myStrlen("china\0japan"));
return0;
}
练习4:
DIY库函数char*strcat(char*dest,constchar*src);
char*strcat(char*dest,constchar*src)
{
if(0==dest||0==src)
{
return0;
}
char*p=dest;
while(*dest)
{
dest++;
}
while(*str)
{
*dest++=*str++;
}
*dest='\0';
returnp;
}
demo:
编写函数,从字符串中找出空格,并返回空格个数
intcheck(char*p,intlen);
intmain(void)
{
chara[20]="wearefamily";
intspaceNum=0;
spaceNum=chack(a,20);
printf("%d\n",spaceNum);
return0;
}
//利用字符串以'\0'结尾的特性,对字符串进行检测
intcheck(constchar*p)
{
if(0==p)
{
return-1;
}
intnum=0;//统计空格个数
while(*p!
='\0')
{
if(*p=='')num++;
p++;
}
returnnum;
}
demo:
编写函数,从字符串中找出某个字符,并用逗号替换,并返回空格个数
intexchang(char*p,charn);
intmain(void)
{
chara[]="wearefamily";
intspaceNum=0;
spaceNum=exchange(a);
printf("%d\n",spaceNum);
puts(a);
return0;
}
intexchang(char*p,charn)
{
intnum=0;
while(*p!
='\0')
{
if(*p=='')
{
*p=',';
num++;
}
p++;
}
returnnum;
}