第十二章字符串

上传人:ni****g 文档编号:567500801 上传时间:2024-07-20 格式:PPT 页数:30 大小:98.50KB
返回 下载 相关 举报
第十二章字符串_第1页
第1页 / 共30页
第十二章字符串_第2页
第2页 / 共30页
第十二章字符串_第3页
第3页 / 共30页
第十二章字符串_第4页
第4页 / 共30页
第十二章字符串_第5页
第5页 / 共30页
点击查看更多>>
资源描述

《第十二章字符串》由会员分享,可在线阅读,更多相关《第十二章字符串(30页珍藏版)》请在金锄头文库上搜索。

1、第十二章 字符串12.1 字符串的存储形式一.字符串常量 C语言中没有字符串数据类型,但是,C语言中却有“字符串常量”。在C语言中,以双引号括起来的、由若干个字符组成的序列即为字符串常量,如“spels”即为一个字符串。 在存储字符串时,C语言编译系统会在字符串最后自动加上0作为该字符串的结尾符。0是一个转义字符,在前面提到过,它的ASCII为0,也称为“空值”。如下图所示是字符串“spels”在内存中的存储形式。可以看到字符串结尾已经被自动加上了字符0,而且我们可以看出,该字符串长度为5(字符串长度不包括结尾符0),而在内存中却需要6个字节来存放该字符串(C语言中,一个字符是用一个字节来存放

2、的)。spels0二. 使用一维字符数组存放字符串通过一维字符数组可以处理字符串。C语言中的字符数组,每个数组元素都是一个字符,当这些数组元素的最后一个字符是0时,我们就认为该字符数组保存的是一个字符串。比如以下例子:例12.1 char str10=s, p, e, l, s, 0;由数组的知识我们可以知道,该字符型数组的前5个元素(str0到str4)分别被赋了5个字符s, p, e, l和s,第5个元素(str5)被赋了空值0。这样该数组在内存中的存储形式如下图所示。spels00000因为str数组中第5个数组元素str5存放了0这个字符串结尾符,所以我们可以说str字符数组存放的就是

3、“spels”字符串。三. 将字符串赋给字符数组通过赋值,我们可以让一个字符数组存放一个字符串。我们有以下几种赋值方式。1.通过对单个数组元素赋值 例12.2 char str10; str0=s; str1=p; str2=e; str3=l; str4=s; str5=0;说明:(1)字符数组大小必须定义足够大,以便能够保存后面给出的字符串常量,同时要考虑到字符串结尾符0也占用了一个字节,因此字符串的长度必须小于字符数组的大小。(2)在字符串的末尾必须赋空值0,用以表示字符串结束。在上面的例子中,字符串“spels”的长度是5,而数组str的大小为10,符合上面的要求。例12.3 char

4、 str10=s,p,e,l,s;当赋值的个数少于所定义数组的元素个数时,将自动给后面的元素补以初值0。例12.4 char str=s,p,e,l,s,0;字符数组str存放的是“spels”字符串,str字符串的长度是5。在定义str数组时,没有指定该数组的大小,因此该数组大小系统默认为6。2. 直接把字符串常量赋给字符数组例12.5 char str10=“spels”; 或 char str10=“spels”;在例12.5中是在字符数组定义时对其进行初始化,把一个字符串常量直接赋给数组。它的存储方式与例12.1中的数组str相同。注意:例12.3、例12.4、例12.5均是在字符数组

5、进行定义时赋初值,如果不是在定义时赋初值,必须遵照例12.2的方法单个元素逐个赋值。例如以下的赋值语句是错误的: char str10; str=“spels”;12.2 指针与字符串在C语言中,可以通过字符指针来处理字符串。例12.6 char *p=“spels”;在例12.6中,我们把“spels”这个字符串赋值给了字符指针p,其实质是把保存字符串“spels”的那段内存的首地址赋给了指针p。使得指针p指向了字符串“spels”,我们就可以通过指针p来处理字符串”spels”。例12.7 char *p; p=“spels”;先定义字符指针p,然后再把字符串“spels”赋给p,以使字符

6、指针p指向字符串”spels”。在例12.6、例12.7中,指针p处理的都是字符串“spels”,p的字符串长度是5。例12.8 char str10; str=“spels”;例12.8是一个错误的例子,因为str是一个字符数组,数组名是一个指针常量。第二条语句str=“spels”;相当于把字符串”spels”的首地址赋给str,试图改变str的值。但str是指针常量,其值不能改变,所以会发生错误。例12.9 char str=“spels”, *pstr=“spels”;例12.9中分别定义了字符数组str和字符指针pstr,且处理的都是“spels”字符串,但在内存中,它们的处理方式不

7、一样的。开辟内存单元如下所示。数组str:指针pstr:pstr:spels0spels012.3 字符串的输出一.使用printf函数输出字符串 在printf的输出格式中,%s代表字符串,可以通过该格式输出字符串。如下例:例12.10 char str=“Hello, Spels!”; printf(“%s”,str);在该例中,数组str存放的是一个字符串。当调用printf函数对该数组使用%s格式进行输出时,系统将把字符串中的字符按顺序输出到屏幕上,直到遇到0为止。输出结果如下: Hello, Spels!例12.11 char str1=“Hello,Spels!”; printf(

8、“%s”,str1+6);该例的输出结果是: Spels!根据指针的知识我们可以知道,str1+6是指向str6的指针。把str1+6作为字符串进行输出时,系统把str1+6当作该字符串的首地址,所以会得到如上输出。例12.12 char str1=“Hello0,Spels!”; printf(“%s”,str1);输出结果如下: Hello注意:在Hello后面是一个控制0,因此字符串str1实际上是“Hello”。二. 使用puts函数输出字符串程序在使用puts来对字符串进行输出时,要在程序中包含头文件stdio.h。puts函数在输出完字符串后,会自动输出一个换行符。puts的调用格

9、式: puts(字符串首地址);例12.13 char *pstr=“Hello, Spels!”; puts(pstr);程序输出结果如下: Hello, Spels!在输出完字符串后,系统会自动输出一个换行符,是屏幕上的光标跳到下一行。12.4 字符串的输入一. 输入字符串的必要条件 当对字符串进行输入时,输入项可以是一个字符数组名,这样输入的字符串将存放到该数组中,此时数组应该足够大,以能保存输入的字符串;输入项还可以是字符指针,这里的字符指针必须是指向确切的、足够大的存储空间,以便输入的字符串可以存放到该指针所指向的内存空间中。二. 使用scanf函数输入字符串在scanf中,可以使用

10、格式%s来输入一个字符串。例12.14 char str20; scanf(“%s”,str);以上程序运行后,从键盘输入:spels(此处CR代表Enter)则输入的字符串从str0开始依次放入数组str中,在最后一个字符!后,系统会自动在数组后面加上0。说明:(1)使用scanf通过%s格式进行输入时,输入的空格和回车都会被认为是数据的分隔符,而不作为数据被读入。(2)如果输入项是数组元素的地址时,输入数据将从这一地址开始存放。三. 使用gets函数输入字符串程序在使用gets来对字符串进行输入时,要在程序中包含头文件stdio.h。gets函数的调用格式: gets(待输入字符串首地址)

11、;例12.15 char str120; gets(str1);执行上面语句,若从键盘输入:Hi spels系统将读入10个字符,包括空格和回车符,依次存放在数组str中,系统自动用0来取代最后的回车符。12.5 字符串数组字符串数组,即数组中的每一个元素存放的都是一个字符串。在C语言中,可以通过二维字符数组或一维指针数组处理。一. 二维字符数组存放字符串数组 通过前面的学习,我们可以把二维数组看作是一个一维数组,该数组的每一个元素又是一个一维数组。假如这些一维数组中存放的都是字符串,那么这个二维数组保存的就是一个字符串数组。如:char str520;我们可以把这个二维数组看作是一个由5个字

12、符串组成的一维数组,每个字符串的长度最大可以是19个字符。例12.16 char name420=“I”,”am”,”a”,”teacher”;或 char name20=“I”,”am”,”a”,”teacher”;例12.16中,二维数组name存放的就是一个字符串数组。name0、name1、name2、name3分别存放了“I”,”am”,”a”,”teacher”四个字符串。可以调用puts(namei)来对以上字符串进行输出,其中i的取值应该在01之间。二. 指针数组处理字符串数组可以定义一个一维字符指针数组,来处理字符串数组。若字符指针数组中的每一个元素都指向一个字符串,即可以认

13、为该指针数组处理的是一个字符串数组。 char *pname4= “I”,”am”,”a”,”teacher”;或char *pname= “I”,”am”,”a”,”teacher”;pname中的四个元素pname0 、pname1、 pname2、 pname3分别指向字符串“I”,”am”,”a”,”teacher”。系统通过无名的一维数组来存储这些字符串,各字符串之间并不一定占用连续的存储单元。一旦pname中的元素重新赋值,如果没有其它字符指针指向相应的字符串,则相应的字符串就会丢失。可以通过pnamei来引用上述中的字符串,或者通过pnameij来引用该字符串中的字符。12.6

14、对字符串的操作一. 字符串拷贝例12.17 编写函数strcopy(char *d,char *s), 将指针s所指向的字符串复制到指针d所指向的存储空间中。 char *strcopy(char *d, char *s) char *p=d; while(*s!=0) *p=*s; p+; s+; *p=0; return d; 复制字符串,就是把s所指向的字符串,逐个的赋给d所指向的存储空间。C语言系统为用户提供了库函数strcpy可以实现字符拷贝的功能。strcpy的调用格式: strcpy(d,s);此函数把s指向的字符串拷贝复制到d指向存储空间。注意:在调用这个函数时,程序必须包含s

15、tring.h头文件。同时为了保证赋值的合法性,d所指向的空间长度必须足够容纳s串。二. 求字符串长度例12.18 编写函数strlength(char *str),求字符串str的字符串长度。 int strlength(char *str) int i=0; while(stri!=0) i+; return i; C语言系统为用户提供了库函数strlen可以实现以上函数功能。strlen的调用格式为: strlen(s);此函数返回s指向的字符串的长度。可以把该函数的返回值赋给一个整型变量,如len=strlen(s);注意:在调用这个函数时,程序必须包含头文件string.h头文件。三

16、. 字符串链接例12.19 编写函数strcatt(char *d, char *s),将s指向的字符复制到d所指向字符串的后面。 void strcatt(char *d, char *s) int len; len=strlen(d); d+=len; while(*s!=0) *d=*s; d+; s+; *d=0; 该函数先求出d字符串的长度,然后把指针d移动到字符串d的末尾,最后通过while循环把s所指向的字符串的字符依次赋给d指向的字符串的后面。C语言系统为用户提供了库函数strcat可以实现以上函数功能。strcat调用格式为: strcat(d,s);此函数把s指向的字符串复

17、制到d指向的字符串的后面。注意:在调用这个函数时,程序必须包含头文件string.h头文件。同时,为了保证赋值的合法性,d所指向的空间必须足够容纳d字符串以及s字符串。四. 字符串比较例12.20 编写函数strcompare(char *s1, char *s2), 将两个字符串s1和s2进行比较,若s1大于s2,函数返回正值;若s1等于s2,函数返回0;若s1小于s2,函数返回负值。 int strcompare(char *s1, char *s2) while(*s1=*s2&*s1) s1+; s2+; return(*s1-*s2); 字符串比较,即把两个字符串相对应的字符拿出来进行比较,返回第一个不相等的字符比较出来的大小即可。C语言系统为用户提供了库函数strcmp可以实现以上函数功能。调用格式为: strcmp(s1,s2);注意:在调用这个函数时,程序必须包含string.h头文件。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 资格认证/考试 > 自考

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号