c语言字符串课件_第1页
c语言字符串课件_第2页
c语言字符串课件_第3页
c语言字符串课件_第4页
c语言字符串课件_第5页
已阅读5页,还剩63页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Chap

10字符串字符串常量字符串处理函数字符数组和字符指针向函数传递字符串从函数返回一个字符串指针字符串常量用双引号括起的一串字符是字符串常量,C语言编译系统自动为其添加'\0'结束符"Howareyou"Howareyou\0一串以'\0'结尾的字符在C语言中被看作字符串C语言并没有为字符串提供任何专门的表示法,使用数组或者字符指针这两种方式来表示、处理字符串。字符数组:每个元素都是字符类型的数组charstr[80];字符串的存储HowareyouHowareyou\0是字符数组,但不代表字符串数组的最后一个元素必须是'\0'\0用字符型数据对数组进行初始化charstr[6]={'C','h','i','n','a','\0'};用字符串常量直接对数组初始化charstr[6]={"China"};charstr[6]="China";字符数组的初始化字符指针字符串是一串用双引号引起来的字符HelloChina\0字符指针就是指向字符类型数据的指针"HelloChina"pStr数组最后一个元素必须是'\0'才表示字符串str="HelloChina";HelloChina\0"HelloChina"pStrcharstr[12]={"HelloChina"};

char*pStr;pStr="HelloChina";strWhy?数组名str是常量指针

字符指针pStr是变量

这两种字符串的表示方法:定义和初始化方法不同

char*pStr="HelloChina";HelloChina\0"HelloChina"pStrcharstr[12]={"HelloChina"};

char*pStr;pStr="HelloChina";str字符数组与字符指针的重要区别Thisisastring\0charsa[]="Thisisastring";char*sp="Thisisastring";saspThisisastring\0如果要改变数组sa所代表的字符串,只能改变数组元素的内容如果要改变指针sp所代表的字符串,通常直接改变指针的值,让它指向新的字符串charsa[]="Thisisastring";char*sp="Thisisastring";sp=“Hello”;合法sa=“Hello”;

非法数组名是常量,不能对它赋值示例定义字符指针后,如果没有对它赋值,指针的值不确定char*s;scanf(“%s”,s);定义指针时,先将它的初值置为空char*s=NULL;char*s,str[20];s=str;scanf(“%s”,s);字符指针的使用-先赋值,后引用不要引用未初始化的指针!!!函数原型声明在stdio.h或string.h中给出字符串的输入和输出输入字符串:scanf()或gets()输出字符串:printf()或puts()

stdio.h常用的字符串处理函数charstr[80];i=0;while((str[i]=getchar())!='\n')i++;str[i]='\0';字符串的输入输出:

第一种方式:循环接收输入的字符for(i=0;str[i]!='\0';i++){ putchar(str[i]);}putchar('\n');按字符逐个输入/输出charstr[10];一般不用字符串长度控制字符串的输入输出:第一种方式:循环输出字符(1)scanf("%s",str)控制说明符:%s输入参数:字符数组名,不加地址符遇回车或空格输入结束,并自动将输入的一串字符和‘\0’送入数组中(2)gets(str)输入参数:字符数组名,不加地址符

遇回车输入结束,自动将输入的一串字符和‘\0’送入数组中

字符串的输入:

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

输出遇‘\0’结束(2)puts(str)puts("hello");输出参数可以是字符数组名、字符指针、字符串常量,输出遇‘\0’自动转换为换行字符串的输出

第二种方式:输出字符串整体charsa[]="array";char*sp="point";printf("%s",sa); printf("%s",sp); arraypointprintf("%s",sa+2);printf("%s",sp+3);raynt字符串输出举例:#include<stdio.h>intmain(){charstr[80];scanf("%s",str);printf("%s",str);printf("%s","Hello");return0;}字符串输入输出函数示例(1)输入:Programming输出:ProgrammingHello输入:Programmingisfun!

输出:ProgrammingHello字符串输入输出函数示例(2)输入:Programming输出:ProgrammingHello输入:Programmingisfun!

输出:Programmingisfun!Hello#include<stdio.h>intmain(){charstr[80];gets(str);puts(str);puts("Hello");return0;}从键盘输入一个人名,把它显示在屏幕上Why?从键盘输入一个人名,把它显示在屏幕上使用函数gets(),从键盘输入一个带有空格的人名,然后把它显示在屏幕上使用函数gets(),从键盘输入一个带有空格的人名,然后把它显示在屏幕上不限制输入字符串的长度易引起缓冲区溢出,给黑客攻击以可乘之机使用函数gets(),从键盘输入一个带有空格的人名,然后把它显示在屏幕上能够限制输入字符串的长度从键盘输入一个带有空格的人名,然后在显示人名的前面显示"Hello",Isaidto从键盘输入一个带有空格的人名,然后在显示人名的前面显示"Hello",Isaidto#include<string.h>字符串处理函数

strcpy(目的字符串,源字符串);stringcopystrlen(字符串);stringlengthstrcat(目的字符串,源字符串);stringcombinationstrcmp(字符串1,字符串2);stringcomparison计算字符串长度strlen(字符串);stringlengthcharstr[10]={"China"};printf("%d",

strlen(str));打印结果是5,6,还是10?China\0不包括\0的实际字符的个数#include<string.h>

使用的形式:strlen(str)作用:计算字符串的有效长度,不包括‘\0’staticcharstr[20]=“Howareyou?”strlen(“hello”)的值是:5strlen(str)的值是:12字符串长度函数strlen计算字符串长度stringlengthlen=

strlen(str);for(i=0;i<len;i++){ putchar(str[i]);}putchar('\n');用长度控制字符串输出strlen(字符串);#include<string.h>字符串复制stringcopy字符串能否用=整体复制?str2=str1;strcpy(str2,str1);注意复制的方向!str2必须足够大!#include<string.h>strcpy(目的字符串,源字符串);想想这个函数是如何实现字符串复制的?#include“stdio.h”#include“string.h”intmain(void){charstr1[20],str2[20];gets(str1);strcpy(str2,str1);puts(str2);return0;}strcpy()示例输入:1234输出:1234字符串连接stringcombinationstrcat(str2,str1);str2必须足够大!Hello\0\0\0\0\0\0\0

China\0HelloChina\0\0strcat(目的字符串,源字符串);strcat(str2,str1);连接两个字符串str2和str1,并将结果放入str2中,str2的长度要足够大字符串连接函数strcat#include"stdio.h"#include"string.h"intmain(void){charstr2[80],str1[20];gets(str2);gets(str1);strcat(str2,str1);

puts(str2);return0;}输入Letusgo.

输出:Letusgo.字符串比较stringcomparison字符串能否用>,<,==比较大小?if(str2==str1)if(strcmp(str2,str1)==0)strcmp(字符串1,字符串2);strcmp(str1,str2)比较两个字符串str1和str2的大小。从两个字符串的首字符开始,依次比较对应的字符,直到出现不同的字符或遇‘\0’为止规则:按字典序(ASCII码序)如果str1和str2相等,返回0;如果str1大于str2,返回一个正整数;如果str1小于str2,返回一个负整数;字符串比较函数strcmp字符串比较stringcomparison字符串是如何比较大小的?当出现第一对不相等的字符时,就由这两个字符决定所在字符串的大小,返回其ASCII码比较的结果值comparecomputercompare<computerstrcmp(str1,str2)<0为真strcmp(字符串1,字符串2);staticchars1[20]="sea";

strcmp(s1,"Sea");strcmp("Sea","See");strcmp("Sea","Sea");字符串比较函数strcmp正整数负整数0#include“stdio.h”#include“string.h”intmain(void){intresult;chars1[20],s2[20];gets(s1);gets(s2);result=strcmp(s1,s2);printf(“%d”,result);return0;}strcmp()示例输入:12345输出:-4或者-1利用字符串比较函数比较字符串的大小

strcmp(str1,str2);

为什么定义这样的函数???总结:用strcmp()比较字符串strcmp(str1,str2)>0strcmp(str1,“hello”)<0strcmp(str1,str2)==0str1>str2str1<“hello”str1==str2

比较字符串首元素的地址比较字符串的内容按奥运会参赛国国名在字典中的顺序对其入场次序进行排序按奥运会参赛国国名在字典中的顺序对其入场次序进行排序字符串处理函数向函数传递字符串时,既可使用字符数组作函数参数,也可使用字符指针作函数参数传地址调用向函数传递字符串unsignedintMyStrlen(charstr[]){

inti;

unsignedintlen=0;

for(i=0;str[i]!='\0';i++) { len++; }

return(len);}计算实际字符个数方法1:用字符数组实现统计实际字符个数

(不含'\0')计算实际字符个数unsignedintMyStrlen(constchar*pStr){

unsignedintlen=0;

for(;*pStr!='\0';pStr++) { len++; }

return(len);}方法2:用字符指针实现统计实际字符个数

(不含'\0')voidMyStrcpy(chardstStr[],charsrcStr[]){

inti=0;

while(srcStr[i]!='\0') { dstStr[i]=srcStr[i]; i++; } dstStr[i]='\0';}字符串复制—用字符数组编程HelloChina\0

srcStr[i]dstStr[i]Hi=0ei=1li=2li=3oi=4i=5Ci=6hi=7ii=8ni=9ai=10\0srcStr[i]=='\0voidMyStrcpy(char*dstStr,char*srcStr){

while(*srcStr!='\0') { *dstStr=*srcStr; srcStr++; dstStr++; } *dstStr='\0';}字符串复制—用字符指针编程HelloChina\0

*srcStr*dstStrHelloChina\0*srcStr=='\0srcStr++srcStrdstStr++dstStrsrcStrdstStrsrcStrdstStrsrcStrdstStrsrcStrdstStrsrcStrdstStrsrcStrdstStrsrcStrdstStrsrcStrdstStrsrcStrdstStrsrcStrdstStrsrcStrdstStr从函数返回字符指针:

编程实现strcat()的功能从函数返回字符指针:

编程实现strcat()的功能返回字符串首地址从函数返回字符指针:

编程实现strcat()的功能字符串加密问题#defineMAXLINE100voidencrypt(char*s);intmain(void){charline[MAXLINE];printf("Inputthestring:");gets(line);encrypt(line);printf(“Afterbeingencrypted:%s\n",line);return0;}Inputthestring:hellohangzhouAfterbeingencrypted:ifmmp!ibohaipvvoidencrypt(chars[]){inti; for(i=0;s[i]!='\0';i++)if(s[i]=='z')s[i]='a'; elses[i]=s[i]+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;i<5;i++){scanf("%d",&x);if(x<min)min=x;}printf("minis%d\n",min);return0;}求最小字符串#include<stdio.h>#include<string.h>intmain(){inti;charsx[80],smin[80];scanf("%s",sx);

strcpy(smin,sx);for(i=1;i<5;i++){scanf("%s",sx);if(strcmp(sx,smin)<0)strcpy(smin,sx);}printf("minis%s\n",smin);return0;}}

28-1990

minis–1

toolkeyaboutzoosea

minisabout

先输入一个正整数n,再输入任意n个整数,计算并输出这n个整数的和。要求使用动态内存分配方法为这n个整数分配空间。任意个整数求和问题*???变量在使用前必须被定义且安排好存储空间全局变量、静态局部变量的存储分配是在编译时确定的,在程序开始执行前完成。自动变量,变量的大小是编译时静态确定的,在执行进入变量定义所在的复合语句时为它们分配存储,。然而很多情况,运行中的很多存储要求在写程序时无法确定指针的应用:用指针实现内存动态分配

存储大小不在编译时就确定下来,而是由用户在程序中通过动态分配确定。使用动态内存管理的方式能有效地使用内存使用时申请用完就释放同一段动态内存可以有不同的用途

动态存储管理

(1)了解需要多少内存空间(2)利用C语言提供的动态分配函数来明确所需要的存

储空间。#include<stdlib.h>(3)使指针指向获得的内存空间,以便使用指针在该

空间内实施运算或操作。(4)当使用内存完毕,一定要释放动态内存。

动态内存分配的步骤

void*malloc(unsignedsize)在内存的动态存储区中分配一连续空间,其长度为size若申请成功,则返回一个指向所分配内存空间的起始地址的指针若申请内存空间不成功,则返回NULL(值为0)返回值类型:(void*)通用指针的一个重要用途将malloc的返回值转换到特定指针类型,赋给一个指针动态存储分配函数malloc/*动态分配n个整数类型大小的空间*/if((p=(int*)malloc(n*sizeof(int)))==NULL){printf(“Notabletoallocatememory.\n”);exit(1);}

调用malloc时,用sizeof计算存储块大小每次动态分配都要检查是否成功,考虑例外情况处理虽然存储块是动态分配的,但它的大小在分配后也是确定的,不要越界使用。

malloc()使用示例void*calloc(unsignedn,unsignedsize)在内存的动态存储区中分配n个连续空间,每一存储空间的长度为size,并且分配后还把存储块里全部初始化为0若申请成功,则返回一个指向被分配内存空间的起始地址的指针若申请内存空间不成功,则返回NULLmalloc对所分配的存储块不做任何事情calloc对整个区域进行初始化

计数动态存储分配函数callocvoidfree(void*ptr)释放由动态存储分配函数申请到的整块内存空间ptr是指向要释放空间的首地址。无返回值。当某个动态分配的存储块使用完毕,要及时将它释放

动态存储释放函数free

void*realloc(void*ptr,unsignedsize)更改以前的存储分配

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论