《c语言ppt课件《字符串》解读.ppt》由会员分享,可在线阅读,更多相关《c语言ppt课件《字符串》解读.ppt(78页珍藏版)》请在三一办公上搜索。
1、第10章 字符串,本章学习内容,字符串常量 字符串处理函数 字符数组和字符指针 向函数传递字符串 从函数返回一个字符串指针,10.1字符串常量,一串以0结尾的字符序列在C语言中被看作字符串。,ASCII码值为0,4,字符串的存储在内存中连续存储,以字符0为结束标识语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串,使用字符数组或字符指针来处理字符串,10.2字符串的存储,说明:0代表ASCII码为0的字符,从ASCII码表中可以查到,ASCII码为0的字符不是一个可以显示的字符,而是一个“空操作符”,即它什么也不做。用它来作为字符串结束标志不会产生附加的操作或增加有效字符,只是一个
2、供辨别的标识。,5,6,字符数组,字符数组每个元素都是字符类型的数组。它的每个元素存放一个字符(占一个字节)字符数组的定义如 char c10;数组c是一维数组,它可以存放10个字符,或者一个长度不大于9的字符串如 char name310;数组c是二维数组,它可以存放30个字符,或者3个长度不大于9的字符串注意:字符串只能存放在字符数组中,7,一维字符数组的初始化,用字符常量赋值如:char c5=C,h,i,n,a;又如:char c6=C,h,i,n,a,0;再如:char c7=C,h,i,n,a;,不是字符串,是字符串,8,用字符的ASCII码赋值如:char c6=67,104,1
3、05,110,97,0;用字符串常量赋值如:char c6=“China”;或者char c6=“China”;,是字符串,注:以字符串方式赋值时,必须保证数组元素个数字符个数+1,(字符串后面需自动加上一个0)。,9,一维字符数组的初始化,省略数组长度如:char c=C,h,i,n,a;再如:char c=“China”;注意:不可以为数组单独整体赋值,例如char str10;str=“China”;,是字符数组,但不代表字符串,是字符串,10.3字符指针,字符指针就是指向字符类型数据的指针,Hello China,pStr,11,字符指针是指向字符型数据的指针,定义为:char*指针;
4、可以用字符数组首地址为指针赋初值char a=Welcome to Beijing.;char*p=a;/对于一维数组,数组名代表首地址 也可以用字符串常量为指针赋初值char*p=“Hello”;/字符串常量本身代表首地址 对p初始化,即使p指向字符串的第一个字符。,由于p为指针变量,指针指向是可以改变的char*p=Hello,*q=p;p=world;,12,13,字符数组与字符指针变量比较:1、char str20=“china”;与char*p=“china”;2、str数组由20个元素组成;而p中存放字符串首地址3、char str20;str=“I love China!”;(X
5、)char*p;p=“I love China!”;()4、str是地址常量;p是指针变量,14,字符数组元素的访问,可以为数组元素赋值,也输出元素的值【例】对字符数组c1赋值09,对字符数组c2赋值AZ,然后输出c1和c2中的数据,#include void main()char c110,c226;int i;for(i=0;i10;i+)c1i=i+48;for(i=0;i26;i+)c2i=i+A;for(i=0;i10;i+)printf(%c,c1i);printf(n);for(i=0;i26;i+)printf(%c,c2i);printf(n);,10.4字符串的访问和输入/
6、输出,15,字符串的输入和输出,C语言中常用的字符串输入输出函数有scanf和printf、gets和puts等1、printf函数一般格式为:printf(%s,字符数组名或字符串常量)其中,%s为字符串格式符例如:char c15=“Hello China!;printf(%s,c);printf(“%s”,“HelloChina!);,注意:用格式%s控制输出 1.输出项一定要是地址 2.遇到0便结束输出,16,2、scanf函数一般格式为:scanf(“%s”,字符数组名)其中,%s为字符串描述符,对应的输入项是字符数组的首地址例如:char c10;scanf(%s,c);,注意:s
7、canf 接收数据的变量要求的是地址:对变量(数组元素),前面才加&对一维数组,数组名就是数组的首地址,不能加“&”,【例10.1】从键盘输入一个人名,把它显示在屏幕上,Why?,scanf函数使用空白(空格、制表符、回车符等)作为输入数据的分隔符,所以只能获取“单词”,【例10.1】从键盘输入一个人名,把它显示在屏幕上,19,3、字符串输入函数gets()调用格式:gets(字符数组名)功能:从键盘输入一个字符串(以回车结束)存入字符数组中,用空字符0 行尾。4、字符串输出函数puts()调用格式:puts(字符数组名或字符串常量本身)功能:输出一个字符串,输出后自动换行,即 puts(st
8、r)与 printf(%sn,str)等价,使用gets()函数允许在字符串中输入空格,用puts函数输出的字符串中可以包含转义字符。例如:char str=“ChinanBeijing”;puts(str);输出:China Beijing 在输出完字符后自动换行。,20,用puts和gets函数只能输出或输入一个字符串,不能写成puts(str1,str2)或gets(str1,str2),21,#include void main()char str15;printf(输入一个字符串:);gets(str);printf(“n输入的字符串是:);puts(str);,字符串的输入和输出,
9、输入一个字符串:Hello China,输入的字符串是:Hello China,22,【例】输入一句话,统计空格的个数,#include void main()char line80;int i,count;printf(n 请输入一行字符:n);gets(line);i=0,count=0;while(linei!=0)if(linei=)count+;i+;printf(n 其中的空格总数为%d n,count);,for(i=0,count=0;linei!=0;i+)if(linei=)count+;,【例10.2】使用函数gets(),从键盘输入一个带有空格的人名,然后把它显示在屏幕
10、上,【例10.3】从键盘输入一个带有空格的人名,然后在显示人名的前面显示Hello,I said to,【例10.3】从键盘输入一个带有空格的人名,然后在显示人名的前面显示Hello,I said to,10.5字符串处理函数,29,字符串数组,字符串数组是存放了若干字符串的字符数组,是一个二维数组,每个字符串占一行,字符串的个数对应数组的行数;字符串数组的定义为:char 数组名字符串个数字符串长度如:char str320;,30,字符串数组的初始化:char a38=str1,str2,string3;char b 6=s1,st2,str3;字符串的引用将字符串数组当作一维数组使用,这
11、个一维数组中的每个元素是个一维数组:a0,a1,a2引用二维字符数组的行下标:a0,a1,a2,31,【例】输入数字星期几(星期天用0表示),输出对应的英文名称分析:建立如下星期表:用二维字符数组存储星期表,每行存一个字符串,32,#include void main()char w_day 10=Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday;int num;printf(Enter a number(06):);scanf(%d,do printf(Enter a number(06):);scanf(%d,while(nu
12、m6);,33,字符串处理函数,与字符串有关的函数在头文件string.h中定义要使用标准库字符串处理函数,程序前应该包含:#include,string.h,strlen,strcpy,strcmp,strcat,34,字符串的长度,字符串的长度是字符串中位于 0 之前的字符的个数根据字符串中 0 的位置来计算字符串长度。若:数组中下标为i 的元素为0,则,串长=i。,例:求字符串的长度#include void main()int length=0;char str30;printf(Input a String:);gets(str);while(strlength!=0)length+
13、;printf(n String length is%dn,length);,length=7,35,求字符串长度函数,求字符串长度函数语法格式:strlen(字符数组名);功能:计算字符串中字符的个数,并将字符的个数作为函数的返回值,不包括字符 0。,#include#include void main()int length=0;char str30;printf(Input a String:);gets(str);while(strlength!=0)length+;printf(n String length is%dn,length);,length=strlen(str);,36
14、,字符串复制函数,字符串复制函数语法格式:strcpy(dest,src);功能:把字符数组src中的字符串拷贝到字符数组dest中,0也一同拷贝。src也可以是一个字符串常量。函数调用后返回的是字符数组dest的首地址。,#include#include int main(void)char source=We change lives;char target20;strcpy(target,source);printf(n 源字符串=%s,source);printf(n 目标字符串=%sn,target);return 0;,目标数组名,源字符串=We change lives 目标字符
15、串=We change lives,target=source;?,字符串不能直接整体赋值必须借助strcpy!,源数组名,37,字符串比较函数,字符串比较函数语法格式:strcmp(str1,str2);功能:比较字符串str1和str2的大小,返回比较的结果。结果为:0-相等,正数-str1大,负数-str2大比较原则:按照串中对应位置字符的ASCII码值比较例如:str1str2“abc”与“abc”,strcmp(str1,str2)=0“abcd”与“abck”,strcmp(str1,str2)0“abc”与“b”,strcmp(str1,str2)0,38,【例】验证用户输入的用
16、户名及密码是否正确,#include#include void main()char name15,pwd15;char sname=System,spwd=123456;int login=0;printf(n 请输入用户名:);gets(name);printf(n 请输入密码:);gets(pwd);if(strcmp(name,sname)=0),请输入用户名:System 请输入密码:123456 您已成功登录!,name=sname?,字符串不能用关系运算符比较大小,必须借助strcmp!,39,字符串连接函数,字符串连接函数语法格式:strcat(dest,src);功能:连接两
17、个字符数组中的字符串,将src串接在dest串后,结果存放在字符数组dest中,函数调用后返回的是字符数组dest的首地址。字符数组dest的长度不可缺省,应足够大。,目标数组名,源数组名,#include#include int main(void)char source_string=UPC;char target_string30=Hello;strcat(target_string,source_string);printf(n 源字符串=%s,source_string);printf(n 目标字符串=%sn,target_string);,源字符串=UPC 目标字符串=Hello
18、UPC,strcat(str2,str1);,【例10.4】按奥运会参赛国国名在字典中的顺序(由小到大)对其入场次序进行排序,#include#include int main(void)char source_string=UPC;char target_string30=Hello;strncat(target_string,source_string,2);printf(n 源字符串=%s,source_string);printf(n 目标字符串=%sn,target_string);,10.6向函数传递字符串,向函数传递字符串时,既可使用字符数组作函数参数,也可使用字符指针作函数参数
19、 传地址调用,例10.5:字符串复制将字符串a复制到串b中,再输出串b。要求不能使用strcpy(),#include#define N 80void MyStrcpy(char dstStr,char srcStr);int main()char aN,bN;printf(Input a string:);gets(a);/*输入字符串*/MyStrcpy(b,a);/*将字符数组a中的字符串拷贝到b中*/printf(The copy is:);puts(b);/*输出复制后的字符串*/return 0;,void MyStrcpy(char dstStr,char srcStr)int
20、i=0;while(srcStri!=0)dstStri=srcStri;i+;dstStri=0;,srcStri,dstStri,H,i=0,e,i=1,l,i=2,l,i=3,o,i=4,i=5,C,i=6,h,i=7,i,i=8,n,i=9,a,i=10,0,srcStri=0,void MyStrcpy(char*dstStr,char*srcStr)while(*srcStr!=0)*dstStr=*srcStr;srcStr+;dstStr+;*dstStr=0;,例10.5:字符串复制用字符指针编程,*srcStr,*dstStr,H,e,l,l,o,C,h,i,n,a,0,*
21、srcStr=0,srcStr+,dstStr+,#include unsigned int MyStrlen(char str);int main()char a80;unsigned int len;printf(Please enter a string:);gets(a);len=MyStrlen(a);/*计算字符串实际字符个数*/printf(The length of the string is:%un,len);return 0;,例10.6:计算实际字符个数(不使用strlen()函数),unsigned int MyStrlen(char str)int i;unsigne
22、d int len=0;for(i=0;stri!=0;i+)len+;return(len);,unsigned int MyStrlen(char*pStr)unsigned int len=0;for(;*pStr!=0;pStr+)len+;return(len);,方法2:用字符指针实现,方法1:用字符数组实现,统计实际字符个数(不含0),将字符串倒置后再打印出来。,对于存放了字符串的字符数组,倒置仅仅是对结束符前的字符进行的,【例】,51,方法1:使用数组#include void main()char strTemp256,ch;int i,j;printf(输入一串字符:);g
23、ets(strTemp);i=j=0;while(strTempj!=0)j+;/*得到0的下标*/j-;while(i j)ch=strTempj;strTempj=strTempi;strTempi=ch;i+;j-;printf(倒置后为:%sn,strTemp);,方法2:使用指针#include void main()char strTemp256,ch;char*p1,*p2;printf(输入一串字符:);gets(strTemp);p2=p1=strTemp;while(*p2!=0)p2+;p2-;while(p1 p2)ch=*p1;*p1=*p2;*p2=ch;p1+;p
24、2-;printf(倒置后为:%sn,strTemp);,52,函数指针(Function Pointers)就是指向函数的指针(Pointer to a Function)指向函数的指针变量存储的是函数在内存中的入口地址 编译器将不带()的函数名解释为该函数的入口地址 函数指针形式为:数据类型(*指针名)(参数列表);例如:int(*p)(int,int);定义p是一个指向函数的指针变量,它指向函数的类型为整型且有两个整型参数的函数。p的类型用int(*)(int,int)表示。,10.7从函数返回字符指针,回顾第9章的函数指针:,常见写法错误:忘记了前一个(),写成int*p();/*声明
25、一个函数名为p、返回值是整型指针的函数*/忘掉了后一个(),写成int(*p);/*定义了一个整型指针*/定义时后一个括号内的参数类型与指向的函数参数类型不匹配,常用的字符串处理函数都是有返回值的,例如:,字符串复制函数语法格式:strcpy(dest,src);字符串连接函数语法格式:strcat(dest,src);二者的原型:char*strcpy(char*str1,const char*str2);char*strcat(char*str1,const char*str2);返回值都是字符串str1的内存空间的首地址(字符指针str1的值)。,增加灵活性,方便级联操作:strcat(
26、str1,hello China);len=strlen(str1);len=strlen(strcat(tr1,Hello China);MyStrcat(str1,str2);printf(“%s”,str1);printf(“%s”,MyStrcat(str1,str2);,【例10.7】编程实现strcat()的功能,const 类型限定符,const是一个C语言的关键字,它限定一个变量不允许被改变。三种基本应用:一.应用在变量const char a=A;a=B;/错误,变量a的值不可以修改。此时代表变量a值不可改变,任何企图修改a变量值的语句都会报错。,二.应用在指针1)应用在*左
27、边const char*p;char const*p;以上两条语句作用一样,都是表示指针指向的变量值(即:*p)不可以修改,但指针p可以修改。例如:const char*p=/对,指针值可以修改,2)应用在*右边 char*const p;表示指针值(p)不可以改变,但指针指向的值(*p)可以改变。例如:char*const p=p和*p都不可以修改。,字符处理函数,#include int isdigit(int c)测试C是否为十进制数字(是:返回值为真(非零)int isalpha(int c)测试C是否为字母int isalnum(int c)测试C是否为字母或数字int islowe
28、r(int c)测试C是否为小写字母int isupper(int c)测试C是否为大写字母int tolower(int c)将字符C转换成小写字符int toupper(int c)将字符C转换成大写字符int isspace(int c)测试C是否为空白int iscsym(int c)测试C是否为字母、下划线或数字int iscntrl(int c)测试C是否为控制字符int ispunct(int c)测试C是否为标点符号int isgraph(int c)测试C是否为可打印字符int isprint(int c)判断C是否为可打印字符,【例10.8】输入一行字符,统计其中的英文字符
29、、数字字符、空格和其它字符的个数。#include#define N 80int main()char strN;int i,letter=0,digit=0,space=0,others=0;printf(Input a string:);gets(str);for(i=0;stri!=0;i+)if(stri=a/*统计其他字符*/,不用字符处理函数实现,printf(English character:%dn,letter);printf(digit character:%dn,digit);printf(space:%dn,space);printf(other character:%
30、dn,others);return 0;,用字符处理函数实现,#include#define N 80int main()char strN;int i,letter=0,digit=0,space=0,others=0;printf(Input a string:);gets(str);for(i=0;stri!=0;i+)if(isalpha(stri)letter+;/*统计英文字符*/else if(isdigit(stri)digit+;/*统计数字字符*/else if(isspace(stri)space+;/*统计空格*/else others+;/*统计其他字符*/,【例10
31、.9】输入一个人的名和姓,然后将名和姓的第一个字幕都变成大写字母。,#include#include#define N 80int main()char nameN;int i;printf(Input a name:);gets(name);/*输入名和姓*/name0=toupper(name0);/*名的首字母变大写*/i=1;while(!isspace(namei)/*跳过所有字母,直到遇空格为止*/i+;,while(!isalpha(namei)/*跳过所有空格,遇到字母为止*/i+;namei=toupper(namei);/*将名的首字母变为大写*/printf(Format
32、ted Name:%sn,name);return 0;,【例10.9】输入一个人的名和姓,然后将名和姓的第一个字幕都变成大写字母。,#include#include#define N 80int main()char nameN;int i;printf(Input a name:);gets(name);/*输入名和姓*/i=0;while(!isalpha(namei)/*跳过所有空格,遇到字母为止*/i+;,namei=toupper(namei);/*将名的首字母变为大写*/while(!isspace(namei)/*跳过所有字母,直到遇空格为止*/i+;while(!isalph
33、a(namei)/*跳过所有空格,直到遇字母为止*/i+;namei=toupper(namei);/*将姓的首字母变为大写*/printf(Formatted Name:%sn,name);return 0;,习题:1、填空1)计算指针p所指向的字符串的长度unsigned int MyStrlen(char*p)unsigned int len;for(;*p!=;p+)len;return;,2)计算字符数组s中字符串长度。方法与1)不同,unsigned int MyStrlen(char s),char*p=s;while(*p!=)p+;/*移动指针使其指向结束标志*/return
34、;/*返回指针p与字符串首地址 之间的差值*/,3)比较两字符串大小,将字符串中第1个出现的不相同字符的ASCII码值之差作为比较结果返回。若第1个字符串大于(小于)第2个字符串,返回正值(负值);相同,则返回0。int MyStrcmp(char*p1,char*p2)for(;*p1=*p2;p1+,p2+)if(*p1=0)return;return;,4)同样实现比较功能,与3)不同。,int MyStrcmp(char s,char t)int i;for(i=0;si=ti;i+)if(si=)return 0;return;,5)比较用户输入口令userInput 与系统内设口令
35、password是否相同。#include“stdio.h”#include“string.h”int main()char password7=“secret”;char userInput81;printf(“Input Password:”);scanf(“%s”,userInput);if()printf(“Correct password!n”);else if()printf(“Invalid password!user inputpasswordn”);return 0;,2.输入一行字符,统计其中有多少个单词。假设单词之间以空格分开。提示:当前字符不是空格,而前一个字符是空格,
36、则表示有新单词出现。#includeint CountWord(char str);int main()char str20;printf(“input a string:”);gets(str);printf(“number=%dn”,CountWords(str);return 0;,int CountWord(char str)int i,num;num=(str0!=?1:0);for(i=1;stri!=0;i+)return num;,写出循环体部分,3.分别用字符数组和字符指针作函数参数两种方法实现:在字符串中删除与某字符相同的字符。,1)字符数组作函数参数 2)字符指针作函数参
37、数#include void Squeeze(char s,char c);int main()char str20,ch;printf(“Input a string:”);gets(str);printf(“Input a character:”);ch=getchar();Squeeze(str,ch);printf(“Results:%sn”,str);return 0;void Squeeze(char s,char c)int i,j;for(i=j=0;si!=0;i+)if(si!=c)sj=si;j+sj=0;/*末尾添加结束标志*/,#include void Squeeze(char*s,char c);,int main()char str20,ch;printf(“Input a string:”);gets(str);printf(“Input a character:”);ch=getchar();Squeeze(str,ch);printf(“Results:%sn”,str);return 0;,写出函数剩余部分,void Squeeze(char*s,char c)char*t1=s;*t2=s;,