1、2022-7-291 Program Design in C LanguagePage第九章第九章 字符串字符串 字符数组字符数组指向字符串的指针变量指向字符串的指针变量字符串处理函数字符串处理函数2022-7-292 Program Design in C LanguagePage一、一、字符数组的定义字符数组的定义字符数组:用来存放字符型数据的数组字符数组:用来存放字符型数据的数组。格式:格式:char 数组名数组名常量表达式常量表达式,;char 数组名数组名常量表达式常量表达式1常量表达式常量表达式2,注意:注意:字符数组的定义、引用、初始化遵循字符数组的定义、引用、初始化遵循“数组数
2、组”的规定。的规定。9.2.1 字符数组的定义、初始化和引用 2022-7-293 Program Design in C LanguagePage在字符数组中,每一个元素只能存放一个字符。在字符数组中,每一个元素只能存放一个字符。例:例:char a10,b30;char s1020,h20100;二维字符数组,可以看作是一个字符串数组。二维字符数组,可以看作是一个字符串数组。9.2.2 字符数组的定义、初始化和引用 2022-7-294 Program Design in C LanguagePage二、二、字符数组的初始化字符数组的初始化 字符数组的赋值要符合数组的要求,除了在定义时字符
3、数组的赋值要符合数组的要求,除了在定义时初始化可以用字符串赋初值,其余只能一个元素一个元初始化可以用字符串赋初值,其余只能一个元素一个元素地赋值。素地赋值。1)给所有元素赋初值:)给所有元素赋初值:例例 char s17=s,t,r,i,n,g,!;char s2=s,t,r,i,n,g,!;!gnirts存储形式为:存储形式为:1、一维字符数组初始化、一维字符数组初始化9.2.3 字符数组的定义、初始化和引用 2022-7-295 Program Design in C LanguagePage例例 char s38=s,t,r,i,n,g,!,0;char s48=string!;char
4、 s58=string!;存储形式为:存储形式为:0!gnirtsC语言中,规定了一个语言中,规定了一个“字符串结束标记字符串结束标记”,以字,以字符符0代表。代表。说明:说明:9.2.3 字符数组的定义、初始化和引用 2022-7-296 Program Design in C LanguagePage在字符数组中,并不要求它最后的一个字符为在字符数组中,并不要求它最后的一个字符为“0”,也可以没有也可以没有“0”。例例:char s5=“China”;也是合法的也是合法的字符串在实际存储时,系统会自动的在其尾部添加一个字符串在实际存储时,系统会自动的在其尾部添加一个结束标志结束标志0。0代
5、表代表ASCII码为码为0的字符,是一个空操作符,表示什的字符,是一个空操作符,表示什么也不干。么也不干。9.2.3 字符数组的定义、初始化和引用 2022-7-297 Program Design in C LanguagePage2)给部分元素赋初值:)给部分元素赋初值:例:例:char s19=C,h,i,n,a,!;char s29=C,h,i,n,a,!,0;char s39=”China!”;char s49=“China!”;存储形式为存储形式为:000!anihC9.2.3 字符数组的定义、初始化和引用 2022-7-298 Program Design in C Langua
6、gePage2、二维字符数组初始化、二维字符数组初始化二维字符串数组的初始化,可以采用二维字符数组初始二维字符串数组的初始化,可以采用二维字符数组初始化形式或者字符串初始化形式化形式或者字符串初始化形式例:例:char name210=J,o,h,n,0,M,a,r,r,y,0;char name210=”John”,”Marry”;char name210=”John”,”Marry”;这三种方法效果一样。这三种方法效果一样。9.2.3 字符数组的定义、初始化和引用 2022-7-299 Program Design in C LanguagePage1.利用格式符利用格式符%c逐个输入、输
7、出字符:逐个输入、输出字符:例例:char str10;int i;for(i=0;i9;i+)scanf(%c,&stri);for(i=0;i9;i+)printf(%c,stri);9.2.4 字符数组的输入输出 2022-7-2910 Program Design in C LanguagePage2.利用格式符利用格式符%s,可以一次输入、输出字符串。,可以一次输入、输出字符串。例例:char str10;scanf(%s,str);printf(%sn,str);%s:遇第一个空白符(空格、:遇第一个空白符(空格、Tab、回车)结束输入,、回车)结束输入,遇第一个遇第一个0结束输出
8、。结束输出。输入:输入:program输出:输出:program 9.2.4 字符数组的输入输出 2022-7-2911 Program Design in C LanguagePage例例:char s110,s215;scanf(%s%s,s1,s2);printf(%s%sn,s1,s2);输入:输入:program C输出:输出:program C输入:输入:How are you输出:输出:How are scanf函数虽然给多个字符的输入提供了简便的函数虽然给多个字符的输入提供了简便的方法,但对于有空格的字符串的输入却有限制。方法,但对于有空格的字符串的输入却有限制。9.2.4 字
9、符数组的输入输出 注意:注意:scanf函数参数要求的是地址,故直接用字符数函数参数要求的是地址,故直接用字符数组名进行操作。组名进行操作。字符数组名表示的是该数组的首地址,因此使字符数组名表示的是该数组的首地址,因此使用格式符用格式符%s可以实现字符串整体的输入和输出。可以实现字符串整体的输入和输出。2022-7-2912 Program Design in C LanguagePage9.3 字符串指针变量的定义与引用 字符串常量的处理是用字符数组来实现的。也字符串常量的处理是用字符数组来实现的。也就是说,无论是否定义了字符数组,对于程序就是说,无论是否定义了字符数组,对于程序中出现的字符
10、串,系统都会在内存中开辟一个中出现的字符串,系统都会在内存中开辟一个字符数组连续存储空间来存放该字符串常量。字符数组连续存储空间来存放该字符串常量。字符串的指针:字符串的首字符地址,也就是字符串的指针:字符串的首字符地址,也就是存放字符串的字符数组的首地址。存放字符串的字符数组的首地址。字符串指针变量:通常把字符串指针变量:通常把char型指针变量称为型指针变量称为字符串指针变量。也就是说,指向字符串的指字符串指针变量。也就是说,指向字符串的指针变量等同于指向字符数组元素的指针变量,针变量等同于指向字符数组元素的指针变量,可以指向字符串中的任意一个字符。可以指向字符串中的任意一个字符。2022
11、-7-2913 Program Design in C LanguagePage9.3 字符串指针变量的定义与引用 字符串指针变量的定义和初始化字符串指针变量的定义和初始化方式一:将存放字符串的字符数组名赋给字符方式一:将存放字符串的字符数组名赋给字符串指针变量,让字符串指针变量指向字符串的串指针变量,让字符串指针变量指向字符串的首字符,然后通过移动指针变量来访问字符串首字符,然后通过移动指针变量来访问字符串的其他字符。的其他字符。例如:例如:char str =Welcome to China!;char *p;p=str;/*等价于等价于 p=&str0 */2022-7-2914 Pro
12、gram Design in C LanguagePage9.3 字符串指针变量的定义与引用 字符串指针变量的定义和初始化字符串指针变量的定义和初始化方式二:在程序中定义一个字符串指针变量,方式二:在程序中定义一个字符串指针变量,并将字符串的首地址直接赋给它,然后通过移并将字符串的首地址直接赋给它,然后通过移动指针变量来访问字符串的其他字符。动指针变量来访问字符串的其他字符。例如:例如:char *p=Welcome to China!;等价于:等价于:char *p;p=Welcome to China!;这里的字符串指针变量这里的字符串指针变量p指向字符串的首字符,指向字符串的首字符,即第
13、一个字符即第一个字符W。2022-7-2915 Program Design in C LanguagePage例例 用字符串指针变量实现字符串操作用字符串指针变量实现字符串操作#include void main()char*str=Welcome to China!;printf(%sn,str);/*整体引用字符串整体引用字符串*/for(;*str!=0;str+)printf(%c,*str);/*逐个引用字符串中的字符逐个引用字符串中的字符*/printf(n);9.3 字符串指针变量的定义与引用 程序运行结果程序运行结果:Welcome to China!Welcome to C
14、hina!2022-7-2916 Program Design in C LanguagePage9.3 字符串指针变量与字符数组 字符数组是由若干个元素组成,每个元素存放一字符数组是由若干个元素组成,每个元素存放一个字符;而字符串指针变量存放的是字符串中某个字符;而字符串指针变量存放的是字符串中某一个字符的地址。一个字符的地址。赋值方式不同。字符数组只能对各个元素分别赋赋值方式不同。字符数组只能对各个元素分别赋值,而字符串指针变量只用赋给字符串的首地址值,而字符串指针变量只用赋给字符串的首地址就可以了。就可以了。例如,下面的赋值是正确的:例如,下面的赋值是正确的:char *str;str=
15、Welcome to China!;/*str是指针变量是指针变量*/下面的赋值是错误的:下面的赋值是错误的:char str30;str=Welcome to China!;/*str是数组名是数组名*/2022-7-2917 Program Design in C LanguagePage9.3 字符串指针变量与字符数组 字符串指针变量占用的内存要少于字符数组。字符串指针变量占用的内存要少于字符数组。例如,编译系统为下面二维字符数组的定义及初始例如,编译系统为下面二维字符数组的定义及初始化分配了化分配了36个字节的内存空间:个字节的内存空间:char str218=Hello,Welcom
16、e to China!;为下面两个字符串指针变量的定义及初始化分配了为下面两个字符串指针变量的定义及初始化分配了28个字节的内存空间:个字节的内存空间:char*str1=Hello,*str2=Welcome to China;字符串指针变量的值是可以改变的,而字符数组的字符串指针变量的值是可以改变的,而字符数组的数组名永远代表该数组的首地址,它的值是不会变数组名永远代表该数组的首地址,它的值是不会变化的。化的。2022-7-2918 Program Design in C LanguagePage例例 将字符串将字符串str1复制到字符串复制到字符串str2#include void ma
17、in()char str1=Copy string,str230;char *p1=str1,*p2=str2;while(*p1!=0)*p2+=*p1+;*p2=0;printf(String str2=);puts(str2);程序运行结果程序运行结果:String str2=Copy string9.3 字符串指针变量与字符数组 2022-7-2919 Program Design in C LanguagePage9.3 字符串指针变量作为函数参数 特点:特点:用字符数组名或字符串指针变量名作为实参,用字符数组名或字符串指针变量名作为实参,向形参传递字符串的首地址;向形参传递字符串的
18、首地址;作为形参的字符数组或字符串指针变量本质上作为形参的字符数组或字符串指针变量本质上都是字符串指针变量;都是字符串指针变量;在被调用函数中可以改变字符串的内容,在主在被调用函数中可以改变字符串的内容,在主调函数中可以得到改变以后的字符串。调函数中可以得到改变以后的字符串。2022-7-2920 Program Design in C LanguagePage例例 连接两个字符串连接两个字符串str1和和str2,连接结果放在,连接结果放在str1中中#include void strlink(char*,char*);void main()char str115=Hello,str2=Wo
19、rld!;strlink(str1,str2);printf(String str1=%sn,str1);void strlink(char*s,char*t)while(*s!=0)s+;/*使使s指向字符串指向字符串str1的末尾的末尾*/while(*t!=0)*s+=*t+;/*将将str2中的字符逐个连接到中的字符逐个连接到str1的末尾的末尾*/*s=0;/*在在str1的末尾加上字符串结束标志的末尾加上字符串结束标志*/程序运行结果程序运行结果:String str1=Hello World!9.3 字符串指针变量作为函数参数 2022-7-2921 Program Design
20、 in C LanguagePage利用字符串输入输出函数利用字符串输入输出函数C语言要求在使用字符串函数时,要包含头文件语言要求在使用字符串函数时,要包含头文件stdio.h1、字符串输入函数、字符串输入函数gets();作用:作用:是将一个字符串输入到字符数组中,当遇是将一个字符串输入到字符数组中,当遇到第一个回车时结束输入到第一个回车时结束输入格式:格式:gets(字符数组名字符数组名);gets()函数同函数同scanf()函数一样,在读入一个函数一样,在读入一个字符串后,系统自动在字符串后加上一个字符字符串后,系统自动在字符串后加上一个字符串结束标志串结束标志0。9.4 字符串函数
21、2022-7-2922 Program Design in C LanguagePage注意:注意:1.函数函数gets()只能一次输入一个字符串。只能一次输入一个字符串。2.函数函数gets()可以读入包含空格和可以读入包含空格和TAB的全部字符,的全部字符,直到遇到回车为止。直到遇到回车为止。使用格式符使用格式符“%s”的函数的函数scanf(),以空格、,以空格、TAB或回车作为一段字符串的间隔符或结束符,所以或回车作为一段字符串的间隔符或结束符,所以含有空格或含有空格或TAB的字符串要用的字符串要用gets()函数输入。函数输入。9.4 字符串函数2022-7-2923 Program
22、 Design in C LanguagePage例例:函数:函数gets()与与scanf()的区别的区别#include main()char str120,str220;gets(str1);scanf(%s,str2);printf(str1:%sn,str1);printf(str2:%sn,str2);输入:输入:program C program C输出:输出:str1:program C str2:program9.4 字符串函数2022-7-2924 Program Design in C LanguagePage2、字符串输出函数字符串输出函数puts()作用:将一个字符串
23、(以作用:将一个字符串(以0结束的字符序结束的字符序列)输出。列)输出。格式:格式:puts(字符数组名字符数组名);或或 puts(字符串字符串);9.4 字符串函数2022-7-2925 Program Design in C LanguagePage注意:注意:1.函数函数puts()一次只能输出一个字符串。一次只能输出一个字符串。2.函数函数puts()可以输出转义字符。可以输出转义字符。3.函数函数puts()输出字符串后自动换行。输出字符串后自动换行。printf()函数可以同时输出多个字符串,并且能函数可以同时输出多个字符串,并且能灵活控制是否换行。所以灵活控制是否换行。所以pr
24、intf()函数比函数比puts()函数更为常用。函数更为常用。9.4 字符串函数2022-7-2926 Program Design in C LanguagePage例例:函数:函数puts()与与printf()的区别的区别#include main()char str1=student,str2=teacher;puts(str1);puts(str2);printf(%s,str1);printf(%sn%s,str1,str2);9.4 字符串函数2022-7-2927 Program Design in C LanguagePage3 测字符串长度函数测字符串长度函数strlen
25、 引用形式:引用形式:strlen(字符数组字符数组)作用:作用:strlen()是测试字符串实际长度的函数,是测试字符串实际长度的函数,它的返回值是字符串中字符的个数(它的返回值是字符串中字符的个数(不包含不包含00的个数的个数)。)。9.4 字符串处理函数2022-7-2928 Program Design in C LanguagePage例:例:char str12=“computer”;printf(“%d”,strlen(str);printf(“%d”,strlen(“computer”);输出的结果都是输出的结果都是89.4 字符串函数2022-7-2929 Program D
26、esign in C LanguagePage例:例:函数函数strlen()的使用。的使用。#include#include main()int i;char str120,str220;gets(str1);gets(str2);for(i=0;str2i!=0;i+);printf(%s:%dn,str1,strlen(str1);printf(%s:%dn,str2,i);printf(%s:%dn,“Good luck,strlen(“Good luck);输入:输入:Good luck Good luck输出输出:Good luck:9 Good luck:9 Good luck:
27、9这两句的功能等同于函数这两句的功能等同于函数strlen(),i 返回串长返回串长9.4 字符串函数2022-7-2930 Program Design in C LanguagePage4字符串拷贝函数字符串拷贝函数strcpy 引用形式:引用形式:strcpy(字符数组字符数组1,字符串,字符串2)作用:将字符串作用:将字符串2复制到字符数组复制到字符数组1中。中。注意:注意:(1)字符数组字符数组1必须足够大,以便容纳字符串必须足够大,以便容纳字符串2的内容。的内容。(2)字符串字符串2可以是字符数组名或者字符串常可以是字符数组名或者字符串常量。当字符串量。当字符串2为字符数组名时,只
28、复制第一为字符数组名时,只复制第一个个0前面的内容(含前面的内容(含0),其后内容不复),其后内容不复制。制。9.4 字符串函数2022-7-2931 Program Design in C LanguagePage例:例:函数函数strcpy()的使用。的使用。main()int i;char str120,str2=“Good luck;char str320,str4=“Good luck;strcpy(str1,str2);for(i=0;str4i!=0;i+)str3i=str4i;str4i=0;printf(str1:%st str2:%sn,str1,str2);printf
29、(str3:%st str4:%sn,str3,str4);输出输出:str1:Good luck str2:Good luckstr3:Good luck str4:Good luck这两句的功能等同于函数这两句的功能等同于函数strcpy()9.4 字符串函数2022-7-2932 Program Design in C LanguagePage5字符串连接函数字符串连接函数strcat 引用形式:引用形式:strcat(字符数组字符数组1,字符串,字符串2)作用:将字符串作用:将字符串2的内容复制连接在字符数组的内容复制连接在字符数组1的后面,其返回值为字符数组的后面,其返回值为字符数组
30、1的地址。的地址。注意:注意:(1)字符数组)字符数组1不能是字符串常量,并且必须足不能是字符串常量,并且必须足够大,以便可以继续容纳字符串够大,以便可以继续容纳字符串2的内容。的内容。(2)连接前字符数组)连接前字符数组1的的0将被字符串将被字符串2覆盖,覆盖,连接后生成的新的字符串的最后保留一连接后生成的新的字符串的最后保留一个个0。9.4 字符串函数2022-7-2933 Program Design in C LanguagePage#include main()char str112=“Good ”;char str2 =“luck!”;printf(“%s”,strcat(str1
31、,str2);例:例:函数函数strcat()的使用。的使用。其状态如下:其状态如下:输出输出:Good luck!Good 0 luck!0 Good luck!0 str1str2str19.4 字符串函数2022-7-2934 Program Design in C LanguagePage6字符串比较函数字符串比较函数strcmp 引用形式:引用形式:strcmp(字符串字符串1,字符串,字符串2)作用:作用:比较字符串比较字符串1和字符串和字符串2。两个字符串从左至。两个字符串从左至右逐个字符比较(按照字符的右逐个字符比较(按照字符的ASCII码值的大小),码值的大小),直到字符不同
32、或者遇见直到字符不同或者遇见0为止。为止。如果全部字符都相同,则返回值为如果全部字符都相同,则返回值为0。如果不。如果不相同,则返回两个字符串中第一个不相同的字符相同,则返回两个字符串中第一个不相同的字符的的ASCII码值的差,即字符串码值的差,即字符串1大于字符串大于字符串2时函数时函数值为正,否则为负。值为正,否则为负。9.4 字符串函数2022-7-2935 Program Design in C LanguagePage例:例:函数函数strcmp()的使用。的使用。main()char str1 =abc,str2 =abc;char str3 =abc,str4 =abc;int
33、i=0;while(str3i=str4i&str3i!=0)i+;i=str3i-str4i;printf(“str1&str2:%dn,strcmp(str1,str2);printf(str3&str4:%dn,i);输出输出:str1&str2:0str3&str4:0这两句的功能等同于函数这两句的功能等同于函数strcmp()9.4 字符串函数2022-7-2936 Program Design in C LanguagePage7 strlwr(字符串字符串)strlwr()的作用是将字符串中大写字母转换成的作用是将字符串中大写字母转换成小写字母。小写字母。8 strupr(字符串
34、字符串)strupr()的作用是将字符串中小写字母转换成的作用是将字符串中小写字母转换成大写字母。大写字母。大小写转换函数:大小写转换函数:9.4 字符串函数2022-7-2937 Program Design in C LanguagePage例:例:编写用户登录程序编写用户登录程序#include string.h main()char username10,name10=zhangsan;gets(username);if(strcmp(username,name)printf(Username are wrong!n);elseprintf(You are right!n);puts(
35、username);9.4 字符串函数2022-7-2938 Program Design in C LanguagePage例:例:有有3个英文字符组成的字符串,要求按照英文个英文字符组成的字符串,要求按照英文字母顺序输出。字母顺序输出。#include main()char name320=John,“Jan,Anny;char str20;int i;for(i=0;i0)strcpy(str,name0);strcpy(name0,name1);strcpy(name1,str);9.4 字符串函数2022-7-2939 Program Design in C LanguagePageif(strcmp(name0,name2)0)strcpy(str,name0);strcpy(name0,name2);strcpy(name2,str);if(strcmp(name1,name2)0)strcpy(str,name1);strcpy(name1,name2);strcpy(name2,str);for(i=0;i3;i+)printf(%sn,namei);9.4 字符串函数