《C语言程序设计》课件4第8章_第1页
《C语言程序设计》课件4第8章_第2页
《C语言程序设计》课件4第8章_第3页
《C语言程序设计》课件4第8章_第4页
《C语言程序设计》课件4第8章_第5页
已阅读5页,还剩69页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第8章字符数组与字符串8.1字符数组的定义8.2字符数组的初始化8.3字符数组的引用8.4字符串8.5常用字符串处理函数8.6案例学习

8.1字符数组的定义

用来存放字符常量的数组称为字符数组,字符数组的定义形式与前面介绍的数值型数组的定义形式十分类似,其一般形式可表示为:

char数组名[常量表达式]

【例8-1】以下程序的输出结果是()。答案:B。

(2)字符数组也可以定义为二维或多维数组。例如:

charc[5][10];

即定义了一个二维字符数组,其数组元素为字符型,数组名为c,其结构为5行10列。和数值型数组一样,数组c也可以看成是由5个含有10个数组元素的一维字符数组组成的数组。

chard[2][3][2];

定义了一个三维字符数组,数组名为d。同样,数组d也可以看成是由2个3行2列的二维字符数组组成的数组。

8.2字符数组的初始化

1.一次性赋值

和数值数组一次性赋值一样,字符数组一次性赋值是指在定义数组的过程中,在一对大括号中分别给出数组元素的值。

【例8-2】一次性赋值实例。图8.1例8-2运行结果以下定义了一个一维字符数组,其有10个数组元素,赋值后各元素的值如图8.2所示。图8.2数组内容图示

2.逐元素赋值

和数值数组一样,字符数组的逐元素赋值指在定义字符数组后,分别对字符数组的每一个元素分别赋值。

【例8-3】逐元素赋值实例。图8.3例8-3运行结果

3.用循环语句赋值

【例8-4】定义一字符数组,用循环语句实现对字符数组赋值。图8.4例8-4运行结果

4.字符串常量赋值

例如:

charstr[10]={"china"};

其在内存中的存储形式str[0]为'c'str[1]为'h',str[2]为'i',str[3]为'n',str[4]为'a'。

【例8-5】从键盘上输入一个国家的首都,然后在屏幕上显示。图8.5例8-5运行结果

【例8-6】以下说法正确的是()。

A.已定义charc[]={“china”};,要将所有的字符输出的语句是:printf(“%s”,&c);

B.已定义charc[]={“china”};,要将所有的字符输出的语句是:printf(“%s”,c[0]);

C.‘a’和“a”所占的存储空间是不一样的

D.‘a’和“a”所占的存储空间是一样的

答案:C。

8.3字符数组的引用

8.3.1字符数组的引用格式

字符数组的引用格式与普通数组完全相同,其一般形式可表示为:

字符数组名[下标];

注意:

(1)和数值数组一样,字符数组的下标引用从0开始。

(2)如果是二维数组或高维数组,则有两个或两个以上的下标。

【例8-7】以下程序的输出结果为()。

【例8-8】有3个字符串s1,s2和s3,其中s1=“abcdef”;,s2=“12345”;用字符数组实现将s1的内容复制到s3中,再将s2的内容添加到s3的后面,最后输出字串s3。

解析:因为在C语言中没有关于字符串的变量,因此对于字符串的操作必须要用字符数组实现,故首先须定义三个字符数组,同时考虑到第三个字符串的长度要能容纳字符串1和字符串2。程序源代码如下:图8.6例8-8运行结果8.3.2字符数组的输入与输出

1.逐个字符操作

用scanf()函数结合格式控制符“%c”可实现逐个字符的输入,用printf()函数结合格式控制符“%c”可实现逐个字符的输出。

【例8-9】逐个字符的输入实例。图8.7例8-9运行结果

2.将整个字符串一次输入或输出

用scanf()函数结合“%s”可实现字符串的输入,用printf()函数结合“%s”可实现字符串的输出。

【例8-10】字符串的输入和输出。图8.8例8-10运行结果

【例8-11】二维字符数组引用实例。图8.9例8-11运行结果

8.4字符串

8.4.1字符串的基本概念

1.C语言对字符串的约定

字符串指若干有效字符组成的序列。所谓有效字符是指系统允许使用的字符,不同的系统允许使用的字符是不相同的。C语言中的字符串可以包括字母、数字、专用字符、转义字符等。例如,下面都是合法的字符串:

"china","basic","a+b=c","32.8"

2.C语言中表示字符串常量的约定

虽然C语言中没有提供字符串数据类型,但却允许使用字符串常量。在前面的介绍中我们提到,字符串常量是由双引号括起来的一串字符,在表示字符串常量时,不需要人为地在其末尾加入 '\0',例如:字符串常量“hello!”不必写成“hello!\0”,C编译程序将自动完成这一工作,在末尾添加字符串结束标记 '\0'。

3.C语言中字符串常量给出的是地址值

每一个字符串常量都分别占用内存中一串连续的存储空间,这些连续的存储空间实际上就是字符型一维数组。这些数组虽然没有名字,但C编译系统却以字符串常量的形式给出存放每一字符串的存储空间的首地址。不同的字符串具有不同的起始地址。也就是说:在C语言中,字符串常量被隐含处理成一个以 '\0' 结尾的无名字符型一维数组。因此,若有以下定义:

chars[10];

则以下赋值是不合法的:

s=“hello”;

因为,字符串常量在赋值过程中给出的是这个字符串在内存中所占的一串连续存储单元(无名一维字符数组)的首地址,而s是一个不可重新赋值的数组名。

4.字符数组与字符串的区别

字符数组的每个元素中可存放一个字符,但它并不限定最后一个字符应该是什么。而在C语言中,因为有关字符串的大量操作都与串结束标志 '\0' 有关,因此,在字符数组中的有效字符后面加上 '\0' 这一特定情况下,可以把这种一维字符型数组看做字符串变量,但它又不等同于一般的变量。如上所述,在字符数组内仅可以存放字符串,不能通过赋值语句将字符串常量或其他字符数组中的字符串直接赋值给字符串变量。可以这样说:字符串是字符数组的一种具体应用。8.4.2用一维字符数组存放字符串

1.用给一般数组赋初值的方式给一维字符数组赋初值

前面我们已经介绍了给一维数组赋初值的方法,包括一次性赋值、逐元素赋值及用循环语句赋值等,例如:

charstr[10]={'s','t','r','i','n','g’,'!','\0'};

赋初值后,字符数组str中的内容如下所示:

2.在赋初值时直接赋字符串常量

前面我们提到,C语言允许用字符串的方式对数组作初始化赋值。例如:

charc[]={‘C’,‘’,‘p’,‘r’,‘o’,‘g’,‘r’,‘a’,‘m’,‘\0’};

这条对字符数组赋值的语句也可以改写为:

charc[]={“Cprogram”};

或去掉{}改写为:

charc[]=“Cprogram”;

数组c在内存中的实际存放情况为:

3.不可以用赋值语句给字符数组整体赋一串字符

当作字符串变量使用的字符数组,不能由赋值语句直接赋字符串常量。例如:

charmark[10];

mark=“cprogram”; /*赋值不合法*/

以上赋值形式是不允许的,因为字符串常量给出的是地址值,而数组名mark是一个地址常量,不能被重新赋值。同理,以下赋值方式也是错误的:

charstr1[10]=“computer”,str2[10];

str2=str1; /*赋值不合法*/

4.给数组元素逐个赋字符值,最后人为加入串结束标志

利用目前学过的知识,在程序执行过程中,可以通过逐个给数组元素赋值的方式,达到给一维字符数组赋字符串的目的。例如:也可以通过给一维字符数组输入字符并在最后加 '\0' 的方式,给一维字符数组赋字符串,例如:

5.用格式说明符%s进行整串输入

在scanf函数中使用格式说明符%s可以实现字符串的整体输入。函数调用形式如下:

scanf(“%s”,str_adr);

这里str_adr是地址值。调用此函数时,输入字符依次放入以这一地址为起点的存储单元中,并自动在末尾加‘\0’。str_adr可以是字符数组名、字符数组元素的地址或字符指针变量。例如:

charstr[15];

scanf("%s",str);

6.在printf()函数中,使用格式说明符 %s进行整串输出

函数调用形式如下:

printf("%s",str_adr);

8.5常用字符串处理函数

8.5.1字符串输出函数puts

格式:

puts(字符数组名)

功能:把字符数组中的字符串输出到显示器上,即在屏幕上显示该字符串。【例8-12】puts函数应用示例。图8.10例8-12运行结果8.5.2字符串输入函数gets

格式:

gets(字符数组名)

功能:从标准输入设备键盘上输入一个字符串,存储到指定数组中。本函数得到一个函数值,即为该字符数组的首地址。

【例8-13】get函数应用示例。图8.11例8-13运行结果8.5.3字符串连接函数strcat

格式:

strcat(字符数组名1,字符数组名2)

功能:把字符数组2中的字符串连接到字符数组1中字符串的后面,并删去字符串1后的串标志'\0'。本函数返回值是字符数组1的首地址。

【例8-14】strcat函数应用示例。图8.12例8-14运行结果8.5.4字符串拷贝函数strcpy

格式:

strcpy(字符数组名1,字符数组名2)

功能:把字符数组2中的字符串拷贝到字符数组1中。串结束标志'\0'也一同拷贝。字符数组名2也可以是一个字符串常量。这时相当于把一个字符串赋予一个字符数组。

【例8-15】strcpy函数应用示例。图8.13例8-15运行结果8.5.5字符串比较函数strcmp

格式:

strcmp(字符数组名1,字符数组名2)

功能:按照ASCII码顺序比较两个数组中的字符串,并由函数返回值返回比较结果。

字符串1 = 字符串2,返回值=0;

字符串1>字符串2,返回值>0;

字符串1<字符串2,返回值<0。

本函数也可用于比较两个字符串常量,或比较数组和字符串常量。

【例8-16】strcmp函数应用示例。图8.14例8-16运行结果8.5.6测字符串长度函数strlen

格式:

strlen(字符数组名)

功能:测字符串的实际长度(不含字符串结束标志'\0')并将其作为函数返回值。

【例8-17】strlen函数应用示例。图8.15例8-17运行结果

8.6案例学习

【例8-18】有3个字符串s1,s2和s3,其中s1=“abcdef”;s2=“12345”;用字符数组实现将s1的内容复制到s3中,再将s2的内容添加到s3的后面,最后输出字符串s3。

本题涉及三个字符串,而字符串在C语言中没有专门的数据类型,因此,考虑定义三个字符数组s1,s2和s3来分别存储三个字符串,然后将s1和s2字符数组的内容依次添加到s3字符串中,最后

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论