c语言-字符串.ppt

上传人:豆**** 文档编号:24475687 上传时间:2022-07-05 格式:PPT 页数:68 大小:2.31MB
返回 下载 相关 举报
c语言-字符串.ppt_第1页
第1页 / 共68页
c语言-字符串.ppt_第2页
第2页 / 共68页
点击查看更多>>
资源描述

《c语言-字符串.ppt》由会员分享,可在线阅读,更多相关《c语言-字符串.ppt(68页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、用双引号括起的一串字符是用双引号括起的一串字符是字符串常量,字符串常量,C C语言编译系语言编译系统自动为其添加统自动为其添加00结束符结束符一串以一串以00结尾的字符在结尾的字符在C C语言中被看作字符串语言中被看作字符串C C语言并没有为字符串提供任何专门的表示法,使用语言并没有为字符串提供任何专门的表示法,使用数组或者字符指针数组或者字符指针这两种方式来表示、处理字符串。这两种方式来表示、处理字符串。字符数组:每个元素都是字符类型的数组字符数组:每个元素都是字符类型的数组char str80;是字符数组,但不代表字符串是字符数组,但不代表字符串数组的最后一个元素必须是数组的最后一个元素必

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

3、nachar str12 = Hello China;char *pStr; = Hello China;数组名数组名str是常量指针是常量指针 字符指针字符指针pStr是变量是变量 char *pStr = Hello China;Hello Chinachar 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如果要改变数组

4、如果要改变数组sa所代表的字符串,只能改变数组元所代表的字符串,只能改变数组元素的内容素的内容如果要改变指针如果要改变指针sp所代表的字符串,通常直接改变指所代表的字符串,通常直接改变指针的值,让它指向新的字符串针的值,让它指向新的字符串char sa = This is a string;char *sp = This is a string;sp = “Hello”; 合法合法sa = “Hello”; 非法非法数组名是常量,不能对它赋值数组名是常量,不能对它赋值定义字符指针后,如果没有对它赋值,指针的值定义字符指针后,如果没有对它赋值,指针的值不确定不确定char *s ;scanf(“

5、%s”, s);定义指针时,先将它的初值置为空定义指针时,先将它的初值置为空char *s = NULL; char *s, str20;s = str;scanf(“%s”, s);不要引用未初始化的指针!不要引用未初始化的指针!函数原型声明在函数原型声明在 stdio.h stdio.h 或或 string.h string.h 中给出中给出 字符串的输入和输出字符串的输入和输出 输入字符串:输入字符串:scanfscanf( )( )或或getsgets( )( ) 输出字符串:输出字符串:printfprintf( )( )或或putsputs( )( ) stdio.hstdio.h

6、char str80;char str80;i = 0; i = 0; while(while(stri = getchar( )stri = getchar( ) != n) != n) i+; i+; stri = 0;stri = 0;一般不用字符串长度控制一般不用字符串长度控制字符串的输入输出:字符串的输入输出:第一种方式:第一种方式:循环输出字符循环输出字符(1) (1) scanf(%s, str) scanf(%s, str) 控制说明符:控制说明符:%s%s输入参数:输入参数:字符数组名字符数组名, ,不加地址符不加地址符遇遇回车或空格回车或空格输入结束,并自动将输入的一串输入

7、结束,并自动将输入的一串字符和字符和 00送入数组中送入数组中 (2) (2) gets(str)gets(str) 输入参数:输入参数:字符数组名字符数组名, ,不加地址符不加地址符 遇遇回车回车输入结束,自动将输入的一串字符和输入结束,自动将输入的一串字符和00送入数组中送入数组中 scanf(%s,str); printf(%sstr);gets(str); puts(str);不能输入带空格的字符串不能输入带空格的字符串可以输入带空格的字符串可以输入带空格的字符串字符串的访问和输入字符串的访问和输入/ /输出输出scanf(%s,str); printf(%s,str);字符串的访问和

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

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

10、f(%s , sa+2); printf(%s , sp+3); ray nt#include int main( ) char str80; scanf(%s, str); printf(%s, str); printf(%s, Hello); return 0; 输入:输入:Programming输出:输出:ProgrammingHello输入:输入:Programming is fun! 输出:输出:ProgrammingHello输入:输入:Programming输出:输出:ProgrammingHello输入:输入:Programming is fun! 输出:输出:Programm

11、ing is fun!Hello#include int main( ) char str80; gets(str); puts(str); puts(Hello); return 0; 从键盘输入一个人名,把它显示在屏幕上 从键盘输入一个人名,把它显示在屏幕上 使用函数gets(),从键盘输入一个带有空格的人名,然后把它显示在屏幕上 使用函数gets(),从键盘输入一个带有空格的人名,然后把它显示在屏幕上 不限制输入字符串的长度不限制输入字符串的长度易引起缓冲区溢出易引起缓冲区溢出,给黑客攻击以可乘之机,给黑客攻击以可乘之机使用函数gets(),从键盘输入一个带有空格的人名,然后把它显示在屏

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

13、1,1,字符串字符串2);2);string comparisonstrlen(strlen(字符串字符串); );string length打印结果是打印结果是 5 5,6 6,还是,还是1010?不包括不包括00的实际字符的个数的实际字符的个数#include #include 使用的形式:使用的形式:strlen(str)strlen(str)作用:计算字符串的作用:计算字符串的有效长度有效长度,不不包括包括 00static char str20=“How are you?”static char str20=“How are you?”strlen(“hello”) strlen(“

14、hello”) 的值是:的值是:5 5strlen(str) strlen(str) 的值是:的值是:1212string length用长度控制字符串输出用长度控制字符串输出strlen(strlen(字符串字符串); );#include #include string copy字符串能否用字符串能否用= =整体复制?整体复制?str2 = str1;str2 = str1;strcpy(str2, str1);strcpy(str2, str1);注意复制的方向!注意复制的方向!str2必须足够大!必须足够大!#include #include strcpy(strcpy(目的字符串目的

15、字符串, ,源字符串源字符串); );想想这个函数是如何实现字想想这个函数是如何实现字符串复制的?符串复制的?# # include “stdio.h”include “stdio.h”# include “string.h”# include “string.h”int main(void )int main(void ) char str120, str220; char str120, str220; gets(str1); gets(str1); strcpy(str2,str1); strcpy(str2,str1); puts(str2); puts(str2); return 0

16、; return 0; 输入:输入:1234输出:输出:1234string combinationstrcat(str2, str1);strcat(str2, str1);str2必须足够大!必须足够大!strcat(strcat(目的字符串目的字符串, ,源字符串源字符串); );strcat(str2, str1)strcat(str2, str1);连接两个字符串连接两个字符串str2str2和和str1, str1, 并将结果放入并将结果放入str2str2中,中,str2str2的长度要足够大的长度要足够大# include stdio.h# include string.hin

17、t main(void) char str280, str120; gets(str2); gets(str1); strcat(str2, str1); puts(str2); return 0;输入输入Let usgo. 输出:输出:Let usgo.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(st

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

19、返回一个负整数;返回一个负整数;string comparison字符串是如何比较大小的?字符串是如何比较大小的?当出现第一对不相等的字符时,就由这两个字符当出现第一对不相等的字符时,就由这两个字符决定所在字符串的大小,返回其决定所在字符串的大小,返回其ASCIIASCII码比较的码比较的结果值结果值comparecompare computer computercompare computercompare computerstrcmp(str1, str2) 0strcmp(str1, str2) 0strcmp(str1, “hello”) str2 str1 “hello”str1 =

20、 str2 比较字符串首元素的地址比较字符串首元素的地址比较字符串的内容比较字符串的内容向函数传递字符串时,既可使用向函数传递字符串时,既可使用字符数组字符数组作作函数参数,也可使用函数参数,也可使用字符指针字符指针作函数参数作函数参数 传地址调用传地址调用unsigned intunsigned int MyStrlen( 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+; le

21、n+; returnreturn (len); (len); 统计实际字符个数统计实际字符个数(不含(不含00)统计实际字符个数统计实际字符个数(不含(不含00)voidvoid MyStrcpy( MyStrcpy(charchar dstStr, dstStr, charchar srcStr) srcStr) intint i = 0; i = 0; whilewhile (srcStri != 0) (srcStri != 0) dstStri = srcStri; dstStri = srcStri; i+; i+; dstStri = 0;dstStri = 0; void MyS

22、trcpy(char *dstStr, char *srcStr)while (*srcStr != 0) *dstStr = *srcStr; srcStr+; dstStr+; *dstStr = 0; srcStr+srcStrdstStr+dstStrsrcStrdstStrsrcStrdstStrsrcStrdstStrsrcStrdstStrsrcStrdstStrsrcStrdstStrsrcStrdstStrsrcStrdstStrsrcStrdstStrsrcStrdstStrsrcStrdstStr返回字符串首地址返回字符串首地址# define MAXLINE 100vo

23、id encrypt(char *s);int main (void) char line MAXLINE; printf (Input the string: ); gets(line); encrypt (line); printf (“After being encrypted: %sn, line); return 0;Input the string:hello hangzhouAfter being encrypted: ifmmp!ibohaipvvoid encrypt (char s ) int i;for(i = 0; si != 0; i+) if (si = z) si

24、 = a; else si = si+1;void encrypt ( char *s) for ( ; *s != 0; s+) if (*s = z) *s = a; else *s = *s+1;int main( ) int i; int x, min; scanf(%d, &x); min = x; for(i = 1; i 5; i+) scanf(%d, &x); if(x min) min = x; printf(min is %dn, min); return 0; #include#include int main( ) int i; char sx80, smin80;

25、scanf(%s, sx); strcpy(smin,sx); for(i = 1; i 5; i+) scanf(%s, sx); if(strcmp(sx, smin)0) strcpy(smin,sx); printf(min is %sn, smin); return 0; 2 8 -1 99 0 min is 1 tool key about zoo sea min is about 先输入一个正整数先输入一个正整数n n,再输入任意再输入任意n n个整数,计算并个整数,计算并输出这输出这n n个整数的和。个整数的和。要求使用要求使用动态内存分配方法动态内存分配方法为这为这n n个整

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

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

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

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

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

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

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

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

34、nclude #includeint main ( ) int n, sum, i, *p; printf(Enter n: ); scanf(%d, &n); /为数组为数组p动态分配动态分配n个整数类型大小的空间个整数类型大小的空间 if (p = (int *) calloc (n, sizeof(int) = NULL) /强制转换成强制转换成int型,存放在指针型,存放在指针p中中 printf(Not able to allocate memory. n); exit(1); printf(Enter %d integers: , n); for (i = 0; i n; i+)

35、scanf(%d, p+i); sum = 0; for (i = 0; i n; i+) sum = sum + *(p+i); printf(The sum is %d n,sum); free(p); return 0; Enter n: 10Enter 10 integers: 3 7 12 54 2 19 8 1 0 15The sum is 81 字符串常量的定义字符串常量的定义字符数组、字符指针的应用字符数组、字符指针的应用字符串的输入输出字符串的输入输出字符串常用函数的定义和使用字符串常用函数的定义和使用动态存储分配函数的定义与使用动态存储分配函数的定义与使用Questions and answers

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁