c语言-字符串课件

上传人:枫** 文档编号:569464035 上传时间:2024-07-29 格式:PPT 页数:67 大小:2.24MB
返回 下载 相关 举报
c语言-字符串课件_第1页
第1页 / 共67页
c语言-字符串课件_第2页
第2页 / 共67页
c语言-字符串课件_第3页
第3页 / 共67页
c语言-字符串课件_第4页
第4页 / 共67页
c语言-字符串课件_第5页
第5页 / 共67页
点击查看更多>>
资源描述

《c语言-字符串课件》由会员分享,可在线阅读,更多相关《c语言-字符串课件(67页珍藏版)》请在金锄头文库上搜索。

1、Chap 10 字符串 字符串常量字符串常量 字符串处理函数字符串处理函数 字符数组和字符指针字符数组和字符指针 向函数传递字符串向函数传递字符串 从函数返回一个字符串指针从函数返回一个字符串指针 用双引号括起的一串字符是用双引号括起的一串字符是字符串常量,字符串常量,C C语言编译系语言编译系统自动为其添加统自动为其添加00结束符结束符How are youHow are youH o w a r e y o u 0H o w a r e y o u 0一串以一串以00结尾的字符在结尾的字符在C C语言中被看作字符串语言中被看作字符串C C语言并没有为字符串提供任何专门的表示法,使用语言并没

2、有为字符串提供任何专门的表示法,使用数组或者字符指针数组或者字符指针这两种方式来表示、处理字符串。这两种方式来表示、处理字符串。字符数组:每个元素都是字符类型的数组字符数组:每个元素都是字符类型的数组char str80;H o w a r e y o uH o w a r e y o uH o w a r e y o u 0H o w a r e y o u 0是字符数组,但不代表字符串是字符数组,但不代表字符串数组的最后一个元素必须是数组的最后一个元素必须是000用字符型数据对数组进行初始化用字符型数据对数组进行初始化 char str6 = C,h,i,n,a,0; 用字符串常量直接对数

3、组初始化用字符串常量直接对数组初始化 char char str6 = China; str6 = China; char char str6 = China;str6 = China;字符串是一串用双引号引起来的字符字符串是一串用双引号引起来的字符 H e l l o C h i n a 0 H e l l o C h i n a 0 字符指针就是指向字符类型数据的指针字符指针就是指向字符类型数据的指针Hello ChinapStr数组最后一个元素必须是数组最后一个元素必须是0才表示字符串才表示字符串strstr = Hello China; H e l l o C h i n a 0 H

4、e l l o C h i n a 0 Hello ChinapStrpStrchar str12 = Hello China; char *pStr;pStrpStr = Hello China;strstr数组名数组名str是常量指针是常量指针 字符指针字符指针pStr是变量是变量 这两种字符串的表示方法:定义和初始化方法不同这两种字符串的表示方法:定义和初始化方法不同这两种字符串的表示方法:定义和初始化方法不同这两种字符串的表示方法:定义和初始化方法不同 char *pStr = Hello China; H e l l o C h i n a 0 H e l l o C h i n a

5、 0 Hello ChinapStrpStrchar str12 = Hello China; char *pStr;pStr = Hello China;strT h i si sas t r i n g 0char sa = This is a string;char *sp = This is a string;saspT h i si sas t r i n g 0如果要改变数组如果要改变数组sa所代表的字符串,只能改变数组元素所代表的字符串,只能改变数组元素的内容的内容如果要改变指针如果要改变指针sp所代表的字符串,通常直接改变指针所代表的字符串,通常直接改变指针的值,让它指向新的字

6、符串的值,让它指向新的字符串char sa = This is a string;char *sp = This is a string;sp = “Hello”; 合法合法sa = “Hello”; 非法非法数组名是常量,不能对它赋值数组名是常量,不能对它赋值定义字符指针后,如果没有对它赋值,指针的值定义字符指针后,如果没有对它赋值,指针的值不确定不确定char *s ;scanf(“%s”, s);定义指针时,先将它的初值置为空定义指针时,先将它的初值置为空char *s = NULL; char *s, str20;s = str;scanf(“%s”, s);不要引用未初始化的指针!不

7、要引用未初始化的指针!函数原型声明在函数原型声明在 stdio.h stdio.h 或或 string.h string.h 中给出中给出 字符串的输入和输出字符串的输入和输出输入字符串:输入字符串:scanfscanf( )( )或或getsgets( )( )输出字符串:输出字符串:printfprintf( )( )或或putsputs( )( ) stdio.hstdio.hchar str80;char str80;i = 0; i = 0; while(while(stri = getchar( )stri = getchar( ) != n) != n) i+; i+; stri

8、 = 0;stri = 0;forforforfor (i=0; stri!=0 ; i+) (i=0; stri!=0 ; i+) (i=0; stri!=0 ; i+) (i=0; stri!=0 ; i+) putchar(stri); putchar(stri); putchar(stri); putchar(stri); putchar(n);putchar(n);putchar(n);putchar(n);char char str10;str10;一般不用字符串长度控制一般不用字符串长度控制字符串的输入输出:字符串的输入输出:第一种方式:第一种方式:循环输出字符循环输出字符(1)

9、 (1) scanf(%s, str) scanf(%s, str) 控制说明符:控制说明符:%s%s输入参数:输入参数:字符数组名字符数组名, ,不加地址符不加地址符遇遇回车或空格回车或空格输入结束,并自动将输入的一串输入结束,并自动将输入的一串字符和字符和 00送入数组中送入数组中 (2) (2) gets(str)gets(str) 输入参数:输入参数:字符数组名字符数组名, ,不加地址符不加地址符 遇遇回车回车输入结束,自动将输入的一串字符和输入结束,自动将输入的一串字符和00送入数组中送入数组中 按字符串整体输入按字符串整体输入按字符串整体输入按字符串整体输入/ /输出输出输出输出s

10、canf(%s,str); printf(%sstr);charcharcharchar str10; str10; str10; str10;gets(str); puts(str);不能输入带空格的字符串不能输入带空格的字符串可以输入带空格的字符串可以输入带空格的字符串字符串的访问和输入字符串的访问和输入字符串的访问和输入字符串的访问和输入/ / / /输出输出输出输出scanf(%s,str); printf(%s,str);charcharcharchar str10; str10; str10; str10;字符串的访问和输入字符串的访问和输入字符串的访问和输入字符串的访问和输入/

11、/ / /输出输出输出输出gets(str); puts(str);空格、回车或制表空格、回车或制表(TabTab)符是输入数据的)符是输入数据的分隔符,因而不能被读分隔符,因而不能被读入,输入遇到这些字符入,输入遇到这些字符时,系统认为字符串输时,系统认为字符串输入结束入结束按字符串整体输入按字符串整体输入按字符串整体输入按字符串整体输入/ /输出输出输出输出( (1 1) ) printf(%s, str) printf(%s, str) printf(%s, hello); printf(%s, hello); 控制说明符:控制说明符:%s%s 输出参数可以是输出参数可以是字符数组名、字

12、符指针、字符串常量字符数组名、字符指针、字符串常量, 输出遇输出遇 0 0 结束结束( (2 2) ) puts(str)puts(str) puts(hello); puts(hello); 输出参数可以是输出参数可以是字符数组名、字符指针、字符串常量字符数组名、字符指针、字符串常量, 输出遇输出遇00自动转换为换行自动转换为换行char sa = array;char sa = array;char *sp = point;char *sp = point;printf(%s , sa); printf(%s , sa); printf(%s , sp); printf(%s , sp);

13、 arraypointprintf(%s,sa+2);printf(%s,sp+3);raynt字符串输出举例:字符串输出举例:字符串输出举例:字符串输出举例:#includeintmain()charstr80;scanf(%s,str);printf(%s,str);printf(%s,Hello);return0;输入:入:Programming输出:出:ProgrammingHello输入:入:Programmingisfun!输出:出:ProgrammingHello输入:入:Programming输出:出:ProgrammingHello输入:入:Programmingisfun!

14、输出:出:Programmingisfun!Hello#includeintmain()charstr80;gets(str);puts(str);puts(Hello);return0;从键盘输入一个人名,把它显示在屏幕上 从键盘输入一个人名,把它显示在屏幕上 使用函数gets(),从键盘输入一个带有空格的人名,然后把它显示在屏幕上 使用函数gets(),从键盘输入一个带有空格的人名,然后把它显示在屏幕上 不限制输入字符串的长度不限制输入字符串的长度易引起缓冲区溢出易引起缓冲区溢出,给黑客攻击以可乘之机,给黑客攻击以可乘之机使用函数gets(),从键盘输入一个带有空格的人名,然后把它显示在屏

15、幕上 能够能够限制输入字符串的长度限制输入字符串的长度从键盘输入一个带有空格的人名,然后在显示人名的前面显示Hello, I said to 从键盘输入一个带有空格的人名,然后在显示人名的前面显示Hello, I said to #include #include strcpy(strcpy(目的字符串目的字符串, ,源字符串源字符串); );string copystrlen(strlen(字符串字符串); );string lengthstrcat(strcat(目的字符串目的字符串, ,源字符串源字符串); );string combinationstrcmp(strcmp(字符串字符串

16、1,1,字符串字符串2);2);string comparisonstrlen(strlen(字符串字符串); );string lengthchar str10 = China;char str10 = China;char str10 = China;char str10 = China;printf(%d,printf(%d,printf(%d,printf(%d, strlen(str)strlen(str)strlen(str)strlen(str); ); ); );打印结果是打印结果是 5 5,6 6,还是,还是1010? C h i n a 0 C h i n a 0 不包括不

17、包括00的实际字符的个数的实际字符的个数#include #include 使用的形式:使用的形式:strlen(str)strlen(str)作用:计算字符串的作用:计算字符串的有效长度有效长度,不不包括包括 00static char str20=“How are you?”static char str20=“How are you?”strlen(“hello”) strlen(“hello”) 的值是:的值是:5 5strlen(str) strlen(str) 的值是:的值是:1212string lengthlen =len =len =len = strlen(str);str

18、len(str);strlen(str);strlen(str);for for for for (i=0; ilen; i+)(i=0; ilen; i+)(i=0; ilen; i+)(i=0; ilen; i+) putchar(stri); putchar(stri); putchar(stri); putchar(stri); putchar(n);putchar(n);putchar(n);putchar(n);用长度控制字符串输出用长度控制字符串输出strlen(strlen(字符串字符串); );#include #include string copy字符串能否用字符串能否用

19、= =整体复制?整体复制?str2 = str1;str2 = str1;strcpy(str2, str1);strcpy(str2, str1);注意复制的方向!注意复制的方向!str2必须足够大!必须足够大!#include #include strcpy(strcpy(目的字符串目的字符串, ,源字符串源字符串); );想想这个函数是如何实现字符想想这个函数是如何实现字符串复制的?串复制的?# # include “stdio.h”include “stdio.h”# include “string.h”# include “string.h”int main(void )int ma

20、in(void ) char str120, str220; char str120, str220; gets(str1); gets(str1); strcpy(str2,str1); strcpy(str2,str1); puts(str2); puts(str2); return 0; return 0; 输入:入:1234输出:出:1234string combinationstrcat(str2, str1);strcat(str2, str1);str2必须足够大!必须足够大!H e l l o H e l l o 0 0 0 0 0 00 0 0 0 0 0 0 0 C h i

21、 n a 0C h i n a 0H e l l o H e l l o C h i n a 0C h i n a 0 0 0strcat(strcat(目的字符串目的字符串, ,源字符串源字符串); );strcat(str2, str1)strcat(str2, str1);连接两个字符串连接两个字符串str2str2和和str1, str1, 并将结果放入并将结果放入str2str2中,中,str2str2的长度要足够大的长度要足够大#includestdio.h#includestring.hintmain(void)charstr280,str120;gets(str2);gets(

22、str1);strcat(str2,str1);puts(str2);return0;输入入Letusgo.输出:输出:Letusgo.string comparison字符串能否用字符串能否用,=比较大小?比较大小?if (str2 = str1)if (str2 = str1)if (strcmp(str2, str1) = 0)if (strcmp(str2, str1) = 0)strcmp(strcmp(字符串字符串1,1,字符串字符串2);2);strcmp(str1, str2)strcmp(str1, str2)比较比较 两个字符串两个字符串str1str1和和str2str2

23、的大小。从两个字符的大小。从两个字符串的首字符开始,依次比较对应的字符,直到出串的首字符开始,依次比较对应的字符,直到出现不同的字符或遇现不同的字符或遇 00为止为止规则:按字典序规则:按字典序( (ASCIIASCII码序码序) )如果如果 str1 str1 和和 str2 str2 相等,返回相等,返回 0 0; 如果如果 str1 str1 大于大于 str2 str2 ,返回一个正整数;返回一个正整数; 如果如果 str1 str1 小于小于 str2 str2 ,返回一个负整数;返回一个负整数;string comparison字符串是如何比较大小的?字符串是如何比较大小的?当出现

24、第一对不相等的字符时,就由这两个字符当出现第一对不相等的字符时,就由这两个字符决定所在字符串的大小,返回其决定所在字符串的大小,返回其ASCIIASCII码比较的码比较的结果值结果值comparecompare computer computercompare computercompare computerstrcmp(str1, str2) 0strcmp(str1, str2) 0strcmp(str1,“hello”)str2str1“hello”str1=str2 比较字符串首元素的地址比较字符串首元素的地址比较字符串的内容比较字符串的内容按奥运会参赛国国按奥运会参赛国国按奥运会参赛

25、国国按奥运会参赛国国名在字典中的顺序名在字典中的顺序名在字典中的顺序名在字典中的顺序对其入场次序进行对其入场次序进行对其入场次序进行对其入场次序进行排序排序排序排序按奥运会参赛国国名在字典中的顺序对其入场次序按奥运会参赛国国名在字典中的顺序对其入场次序按奥运会参赛国国名在字典中的顺序对其入场次序按奥运会参赛国国名在字典中的顺序对其入场次序进行排序进行排序进行排序进行排序向函数传递字符串时,既可使用向函数传递字符串时,既可使用字符数组字符数组作作函数参数,也可使用函数参数,也可使用字符指针字符指针作函数参数作函数参数 传地址调用传地址调用unsigned intunsigned int MySt

26、rlen( MyStrlen(charchar str) str) intint i; i;unsigned intunsigned int len = 0; len = 0; forfor (i=0; stri!=0; i+) (i=0; stri!=0; i+) len+; len+; returnreturn (len); (len); 方法方法方法方法1 1 1 1:用字符数组实现:用字符数组实现:用字符数组实现:用字符数组实现统计实际字符个数统计实际字符个数(不含(不含00)unsigned int MyStrlen(unsigned int MyStrlen(unsigned in

27、t MyStrlen(unsigned int MyStrlen(const char const char const char const char *pStr)*pStr)*pStr)*pStr) unsigned intunsigned intunsigned intunsigned int len = 0; len = 0; len = 0; len = 0; forforforfor (; *pStr!=0; pStr+) (; *pStr!=0; pStr+) (; *pStr!=0; pStr+) (; *pStr!=0; pStr+) len+; len+; len+; le

28、n+; returnreturnreturnreturn (len); (len); (len); (len); 方法方法方法方法2 2 2 2:用字符指针实现:用字符指针实现:用字符指针实现:用字符指针实现统计实际字符个数统计实际字符个数(不含(不含00)voidvoid MyStrcpy( MyStrcpy(charchar dstStr, dstStr, charchar srcStr) srcStr) intint i = 0; i = 0; whilewhile (srcStri != 0) (srcStri != 0) dstStri = srcStri; dstStri = sr

29、cStri; i+; i+; dstStri = 0;dstStri = 0; H e l l o C h i n a H e l l o C h i n a 00 srcStrisrcStrisrcStrisrcStridstStridstStridstStridstStriHHi=0i=0e ei=1i=1l li=2i=2l li=3i=3o oi=4i=4 i=5i=5C Ci=6i=6h hi=7i=7i ii=8i=8n ni=9i=9a ai=10i=1000srcStri=0srcStri=0srcStri=0srcStri=0void MyStrcpy(char *dstSt

30、r, char *srcStr)while (*srcStr != 0) *dstStr = *srcStr; srcStr+; dstStr+; *dstStr = 0; H e l l o C h i n a H e l l o C h i n a 00 *srcStr*srcStr*srcStr*srcStr*dstStr*dstStr*dstStr*dstStrHHe el ll lo oC Ch hi in na a00*srcStr=0*srcStr=0*srcStr=0*srcStr=0srcStr+srcStrdstStr+dstStrsrcStrdstStrsrcStrdst

31、StrsrcStrdstStrsrcStrdstStrsrcStrdstStrsrcStrdstStrsrcStrdstStrsrcStrdstStrsrcStrdstStrsrcStrdstStrsrcStrdstStr返回字符串首地址返回字符串首地址#defineMAXLINE100voidencrypt(char*s);intmain(void)charlineMAXLINE;printf(Inputthestring:);gets(line);encrypt(line);printf(“Afterbeingencrypted:%sn,line);return0;Inputthestri

32、ng:hellohangzhouAfterbeingencrypted:ifmmp!ibohaipvvoidencrypt(chars)inti;for(i=0;si!=0;i+)if(si=z)si=a;elsesi=si+1;voidencrypt(char*s)for(;*s!=0;s+)if(*s=z)*s=a;else*s=*s+1;intmain()inti;intx,min;scanf(%d,&x);min=x;for(i=1;i5;i+)scanf(%d,&x);if(xmin)min=x;printf(minis%dn,min);return0;#include#includ

33、eintmain()inti;charsx80,smin80;scanf(%s,sx);strcpy(smin,sx);for(i=1;i5;i+)scanf(%s,sx);if(strcmp(sx,smin)0)strcpy(smin,sx);printf(minis%sn,smin);return0;28-1990minis1toolkeyaboutzooseaminisabout先输入一个正整数先输入一个正整数n n,再输入任意再输入任意n n个整数,计算并个整数,计算并输出这输出这n n个整数的和。个整数的和。要求使用要求使用动态内存分配方法动态内存分配方法为这为这n n个整数分配空间

34、。个整数分配空间。 变量在使用前必须被定义且安排好存储空间变量在使用前必须被定义且安排好存储空间全局变量、静态局部变量全局变量、静态局部变量的存储分配是在的存储分配是在编译时编译时确定的,在确定的,在程序程序开始执行前开始执行前完成。完成。自动变量自动变量,变量的大小是,变量的大小是编译时编译时静态确定的,在静态确定的,在执行进入变量定执行进入变量定义所在的复合语句时义所在的复合语句时为它们分配存储,。为它们分配存储,。然而很多情况,运行中的很多存储要求在写程序时无法确定然而很多情况,运行中的很多存储要求在写程序时无法确定存储大小不在编译时就确定下来,而是存储大小不在编译时就确定下来,而是由用

35、户在由用户在程序中通过动态分配确定。程序中通过动态分配确定。使用动态内存管理的方式能有效地使用内存使用动态内存管理的方式能有效地使用内存使用时申请使用时申请用完就释放用完就释放同一段动态内存可以有不同的用途同一段动态内存可以有不同的用途 (1 1)了解需要多少内存空间)了解需要多少内存空间(2 2)利用)利用C C语言提供的语言提供的动态分配函数动态分配函数来明确所需要的存来明确所需要的存 储空间。储空间。#include#include(3 3)使指针指向获得的内存空间,以便使用指针在该)使指针指向获得的内存空间,以便使用指针在该 空间内实施运算或操作。空间内实施运算或操作。(4 4)当使用

36、内存完毕,一定要释放动态内存。当使用内存完毕,一定要释放动态内存。 void *malloc(unsigned size) void *malloc(unsigned size) 在内存的动态存储区中分配一连续空间,其长度为在内存的动态存储区中分配一连续空间,其长度为sizesize若申请成功,则返回一个指向所分配内存空间的起始地址的指针若申请成功,则返回一个指向所分配内存空间的起始地址的指针若申请内存空间不成功,则返回若申请内存空间不成功,则返回NULLNULL(值为值为0 0)返回值类型:返回值类型:( (void *void *) )通用指针的一个重要用途通用指针的一个重要用途将将mal

37、locmalloc的返回值转换到特定指针类型,赋给一个指针的返回值转换到特定指针类型,赋给一个指针 /* /* 动态分配动态分配n n个整数类型大小的空间个整数类型大小的空间 */ */if (p = (int *)malloc(n*sizeof(int) = NULL) if (p = (int *)malloc(n*sizeof(int) = NULL) printf(“Not able to allocate memory. n”); printf(“Not able to allocate memory. n”); exit(1); exit(1); 调用调用mallocmalloc时

38、,用时,用sizeof sizeof 计算存储块大小计算存储块大小每次动态分配都要检查是否成功,考虑例外情况处理每次动态分配都要检查是否成功,考虑例外情况处理 虽然存储块是动态分配的,但它的大小在分配后也是确定的,虽然存储块是动态分配的,但它的大小在分配后也是确定的,不要越界使用不要越界使用。 void *calloc( unsigned n, unsigned size) void *calloc( unsigned n, unsigned size) 在内存的动态存储区中分配在内存的动态存储区中分配n n个连续空间,每一存储空间的个连续空间,每一存储空间的长度为长度为sizesize,并且

39、分配后还把存储块里全部初始化为并且分配后还把存储块里全部初始化为0 0若申请成功,则返回一个指向被分配内存空间的起始地址的若申请成功,则返回一个指向被分配内存空间的起始地址的指针指针若申请内存空间不成功,则返回若申请内存空间不成功,则返回NULLNULLmallocmalloc对所分配的存储块不做任何事情对所分配的存储块不做任何事情calloccalloc对整个区域进行初始化对整个区域进行初始化 void free(void *ptr) void free(void *ptr) 释放由动态存储分配函数申请到的整块内存空间释放由动态存储分配函数申请到的整块内存空间ptrptr是是指向要释放空间的

40、首地址。无返回值。指向要释放空间的首地址。无返回值。当某个动态分配的存储块使用完毕,要及时将它释放当某个动态分配的存储块使用完毕,要及时将它释放 void *realloc(void *ptr, unsigned size) void *realloc(void *ptr, unsigned size) 更改以前的存储分配更改以前的存储分配ptrptr必须是以前通过动态存储分配得到的指针必须是以前通过动态存储分配得到的指针参数参数sizesize为现在需要的空间大小为现在需要的空间大小如果调整失败,返回如果调整失败,返回NULLNULL,同时原来,同时原来ptrptr指向存储块的内容不变指向存

41、储块的内容不变如果调整成功,返回一片能存放大小为如果调整成功,返回一片能存放大小为sizesize的区块,并保证该块的的区块,并保证该块的内容与原块的一致。内容与原块的一致。如果如果sizesize小于原块的大小,则内容为原块前小于原块的大小,则内容为原块前sizesize范围内的数据;如范围内的数据;如果新块更大,则原有数据存在新块的前一部分。果新块更大,则原有数据存在新块的前一部分。如果分配成功,原存储块的内容就可能改变了,因此不允许再通过如果分配成功,原存储块的内容就可能改变了,因此不允许再通过ptrptr去使用它。去使用它。 #include#includeintmain()intn,

42、sum,i,*p;printf(Entern:);scanf(%d,&n);/为数组为数组p动态分配动态分配n个整数类型大小的空间个整数类型大小的空间if(p=(int*)calloc(n,sizeof(int)=NULL)/强制转换成强制转换成int型,存放在指针型,存放在指针p中中printf(Notabletoallocatememory.n);exit(1);printf(Enter%dintegers:,n);for(i=0;in;i+)scanf(%d,p+i);sum=0;for(i=0;in;i+)sum=sum+*(p+i);printf(Thesumis%dn,sum);free(p);return0;Entern:10Enter10integers:37125421981015Thesumis81字符串常量的定义字符串常量的定义字符数组、字符指针的应用字符数组、字符指针的应用字符串的输入输出字符串的输入输出字符串常用函数的定义和使用字符串常用函数的定义和使用动态存储分配函数的定义与使用动态存储分配函数的定义与使用Questions and answers

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

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

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