《C语言课程课件 第十章 字符串》由会员分享,可在线阅读,更多相关《C语言课程课件 第十章 字符串(28页珍藏版)》请在金锄头文库上搜索。
1、第10章 字符串 10.1 用一维字符数组存放字符串 10.2 使指针指向一个字符串 10.3 字符串的输入和输出 10.4 字符串数组 10.5 用于字符串处理的函数 10.6 程序举例10.1 用一维字符数组存放字符串字符常量:是用单引号括起来的一个字符。例如A C t ! ?字符串常量:是由双引号括起来的一串字符 。例如“CHINA”在内存中占一个字节在内存中占6个字节在内存中的存储形式是:C H I N A 0在内存中,系统会自动的在字符串的末尾 加上一个0,作为字符串的结束标志,系统 只要看到它就认为该字符串到此就结束了。 但要注意,该字符串的实际长度还是为5。注意由于变量只能存放一
2、个字符,所以字符串的存放只能存储 在数组当中。10.1 用一维字符数组存放字符串10.1.1 通过赋初值的方式给一维字符数组赋字符串 如下定义的是含有10个整型元素的一维数组,并初始化。int a10=2,4,6,8,10;在内存中的存储形式是:2 4 6 8 10 0 0 0 0 0 如下定义的是含有10个元素的一维字符数组,并初始化。char str10=s, t, r, i, n, g, !;在内存中的存储形式是:s t r I n g ! 0 0 0也可以按这种形式进行赋值: char str10=s, t, r, i, n, g, !, 0;在内存中的存储形式是:s t r I n
3、g ! 0 0 0无论用上面哪中方式赋值,字符串中的结束标志总是为第一个。10.1 用一维字符数组存放字符串10.1.1 通过赋初值的方式给一维字符数组赋字符串也可以用赋初值的方式来定义字符数组的大小,这时定义时一定要写成:char str=s, t, r, i, n, g, !, 0; 该字符串的实际长度为7。 该数组中包含了8个元素,在这种情况下,一定要人为的在后面加一个0。 否则该数组中就没有结束标志,就不能称数组中存放的是字符串了。例如:char str=s, t, r, i, n, g, !;该数组中只包含7个元素10.1 用一维字符数组存放字符串10.1.1 通过赋初值的方式给一维
4、字符数组赋字符串也可以直接用字符串常量给一维字符数组赋初值。例如:char str10= “sting!” ;char str10=“sting!”;习惯上均省略花括号注意把一个字符串常量赋值给一个一维字符数组时,数组的元素个数 一定要大于字符串的实际长度char str6=“sting!”;由于字符串的实际长度为6,而数组只有6个存储单元,0将无法存放。如下的定义形式也可以正确进行:char str =“sting!”; 数组中包含7个元素(含 系统自动加的0)10.1 用一维字符数组存放字符串10.1.2 在C程序执行过程中给一维字符数组赋字符 串 在定义时,给一维字符数组赋字符串:cha
5、r mark10=“C Program”;(合法)char mark10; mark=“C Program”;(非法)数组名为地址值,为一个 地址常量,不能被赋值。以下的赋值语句也是错误的:char str110=“computer”, str210;str2=str1; /*赋值不合法*/*分别定义两个一维字符数组*/赋值号左边也为数组名10.1 用一维字符数组存放字符串10.1.2 在C程序执行过程中给一维字符数组赋字符 串例如,我们已经定义了一个一维字符数组,如下:char mark10; 我们也可以逐个给数组元素进行赋值,例如: mark0=C; mark1= ; mark2=P; m
6、ark3=r; mark4=o; mark5=g; mark6=r; mark7=a; mark8=m; mark9=0;也可以在程序运行的过程当中,通过一个循环语句,从键盘上向数组中 输入指定的字符。如下:char mark10; int i; for(i=0;i在内存中的存储形式是:C P r o g r a m 010.2 使指针指向一个字符串可以在定义字符指针变量的同时,将一个字符串赋值给指针变量。例如:char *ps1=“form one”;如上,是把存放字符串常量的无名存储区的首地址赋给指针变量ps1,使ps1 指向字符串的第一个字符f。如下图所示:ps1form one0又如:
7、char str=“form two”, *ps2=str;无名存储区在定义指针变量的同时让指针变量指 向了str的首地址,即指向了字符串的 第一个字符f。ps2form two0str10.2 使指针指向一个字符串通过赋值运算使指针指向一个字符串例如:char *ps1;ps1=“from one”;使指针ps1指向字符 串的第一个字符f。又如:char str =“from two”, *ps2;ps2=str;使指针ps2指向了存放字 符串的字符数组str的首 地址。ps2=10.2 使指针指向一个字符串用字符数组作为字符串和用指针指向的字符串之间的区别若有以下定义: char mark
8、 = “PROGRAM”; char *pmark= “PROGRAM”;它们在内存中的存储形式如下:P R O G R A M 0markpmarkPROGRAM0区别 两个字符串分别占有不同的存储空间。 指针变量pmark中的地址可以改变而指向另外一个长度不同的字符串。10.3 字符串的输入和输出10.3.1 输入和输出字符串时的必要条件对字符串输入输出时的必要条件:输入和输出的格式说明符为 %s输出项字符串常量字符数组名字符指针变量printf(“%sn” , ”I love you!”);输入项字符数组名字符指针变量char str =“I love you!”; printf(“%s
9、n” , str);char str =“I love you!” , *p=str; printf(“%sn” , p);I love you!转去介绍输出时直到遇第一 个0结束输出。10.3 字符串的输入和输出输入项字符数组名字符指针变量当字符数组名作为输入项:char str15; scanf(“%s”,str);输入形式为: PROGRAMMING在内存中的形式是: P R O G R A M M I N G 0 0 0 0说明当字符指针变量作为输入项:char str15 , *p=str; scanf(“%s”,p);操作功能和上面相同 当字符数组名作为输入项时,输入字符串的长度最
10、好不要超过字符数组的个数。 当字符指针变量作为输入项时,该指针变量必须已指向确定的有足够空间的连续存储单元。 用%s格式符输入字符串时,空格和回车符都作为输入数据的分隔符而不能被读入。例如以上程序段输入:APROGRAM MING则在str中存入的只是字符串“APROGRAM”,而不是字符串“APROGRAM MING”10.3 字符串的输入和输出10.3.3 调用gets、puts函数在终端输入或输出一行字符串调用gets函数来输入字符串,例如:char str15; gets( str );若从键盘上依次输入: APROGRAM MING在内存中的形式是: A P R O G R A M
11、M I N G 0 0 系统自动会用0替代 最后的换行符。调用puts函数来输出字符串,例如:char str15; gets( str ); puts( str );若从键盘上依次输入: APROGRAM MINGAPROGRAM MING输出结果为:依次输出存储单元中的字符,遇到第一个0即结束输出,注意,调用该puts函数 输出时,系统并自动输出一个换行符。空格一起 读入10.4 字符串数组所谓字符串数组就是一个二维字符数组。例如:char name1080; /*定义了一个10行80列的二维字符数组*/也可以把该二维数组视为由10个一维数组构成,每一个一维数组中又包含 80个数组元素。注
12、意:作为字符串使用时,每一行最多可以存放79个有效字符,最后一个存储单元留给0,在二维字符数组中,每一行的最后一个存储单元都要有一个0。字符串数组也可以在定义的同时赋初值。例如:char ca35=“A”, ”BB”, ”CCC”;ca0ca1ca2ca00A 0 0 0 0B B 0 0 0C C C 0 0字符串数组ca赋初值后的存储示意图定义时赋初值时行下标可以省略:char ca 5=“A”, ”BB”, ”CCC”;10.4 字符串数组可以定义字符型指针数组并通过赋初值来构成一个类似的字符串数组。例如:char *pa3=“a”, ”bb”, ”ccc”;定义了一个字符型指针数组,该
13、数组中含有3个元素pa0 、pa1、 pa2,且每一个 元素都是一个指向字符串的指针。pa0pa1pa2a 0b b 0c c c 0图示注意:各字符串所占存储单元之间并不一定连续,访问这些字符串全依赖于pa。可以引用的形式有:*(pa0+0) *(pa1+0) *(pa1+1)*(pa2+0) *(pa2+1) *(pa2+2)pa00 pa10 pa11 pa20 pa21 pa2210.5 用于字符串处理的函数C语言中提供了很多有关串操作的库函数,调用这些库函数能够对字符串 进行整体的处理和一些操作。不过,在调用之前,必须在程序前面用命令 行指定包含标准的头文件。 #include 字符串复制(拷贝)函数strcpy。调用形式为:strcpy(s1,s2);此函数功能是把s2所指字符串的内容复制到s1所指存储空间中,函数返回s1的值(即s1 的首地址)。注意:为保证复制的合法性,s1必须指向一个足够容纳s2串的存储空间。 字符串连接函数strcat。调用形式为:strcat(s1,s2)