1、第第6 6章章 字符串字符串字符串基础(概念、表示、输入输出)字符串基础(概念、表示、输入输出)字符串的基本运算字符串的基本运算字符串应用举例(数值与字符串的转换、字符串应用举例(数值与字符串的转换、单词分离)单词分离)&字符常量字符常量v定义定义: :用用单引号单引号括起来的单个括起来的单个普通字符普通字符或或转义字符转义字符. v字符常量的字符常量的值值:该字符的:该字符的ASCIIASCII码码值值转义字符及其含义:转义字符及其含义:转义字符含义nvradddtbf“xhh转义字符含义换行垂直制表回车响铃单引号3位8进制数代表的字符水平制表退格换页反斜线双引号2位16进制数代表的字符例:
2、A-101-x41-65如 A65, a97, 048 , n10如 a A ? n 101v转义字符转义字符: :反斜线后面跟一个字符或一个代码值表示反斜线后面跟一个字符或一个代码值表示6.1 6.1 字符数据字符数据v字符常量与字符串常量不同字符常量与字符串常量不同&字符串常量字符串常量v定义:用双引号定义:用双引号( () )括起来的字符序列括起来的字符序列v存储:存储:每个字符串尾每个字符串尾自动自动加一个加一个 00 作为字符串作为字符串结束标志结束标志h e l l o 0例例 字符串字符串hellohello在内存中在内存中a a 0例 aa例例 空串空串 0例: char ch
3、; ch=A; 例: char ch; ch=A; 【例例】观察下面程序的运行结果观察下面程序的运行结果,注意注意转义字符的使用转义字符的使用 #include void main( ) printf(%d,%cn,a,a); printf(%d,%cn,A+1,A+1); printf(%dn,a-A); printf(%d,%dn,1,x1); printf(%d,%cn,25,x15); printf(I am OKn );字符型变量字符型变量字符的输入与输出字符的输入与输出scanfscanf和和printfprintfscanf(%c,&ch);从键盘输入一个字符,并将输入的字符存从
4、键盘输入一个字符,并将输入的字符存放在变量放在变量ch之中。之中。printf(%c,ch);将字符型变量将字符型变量ch的在屏幕上输出。的在屏幕上输出。 字符的输入与输出字符的输入与输出getchgetch和和putchputch字符输入函数:字符输入函数:函数原型:函数原型:char getch() 或者或者 char getchar()使用方法:使用方法:ch = getch() 或者或者 ch = getchar()字符输出函数字符输出函数:函数原型:函数原型:putch(char ch) 或者或者 putchar(char ch)使用方法:使用方法:putch(ch) 或者或者 pu
5、tchar(ch)6.2 6.2 字符串字符串 字符串的存储字符串的存储 依次存储每个字符依次存储每个字符ASCII码码 例如字符串例如字符串”Strings.n” C C语言并没有为字符串提供任何专门的表示语言并没有为字符串提供任何专门的表示法,完全使用法,完全使用字符数组字符数组和和字符指针字符指针来处理来处理字符串就是一串以用字符串就是一串以用”引起来的字符引起来的字符, , C C语言自动为其添加语言自动为其添加00结束符结束符Hello China 字符表示:字符表示:Strings.n0ASCII码表示码表示:8311611410511010311546100用一维数组表示字符串用
6、一维数组表示字符串字符数组字符数组: :每个元素都是字符类型的数组每个元素都是字符类型的数组vchar str80;是字符数组,但不代表字符串是字符数组,但不代表字符串数组的最后一个元素必须是数组的最后一个元素必须是06.3 6.3 字符串的表示字符串的表示字符数组的初始化字符数组的初始化 逐个元素初始化逐个元素初始化 char str6 = C,h,i,n,a,0; 用字符串常量直接对数组初始化用字符串常量直接对数组初始化 char str11 = China; char str11 = China;必不可少的,必须自己写上去必不可少的,必须自己写上去系统会自动加上系统会自动加上 0 用指针
7、表示字符串变量用指针表示字符串变量 char *str=Hello China;只能进行整体初始化 或者或者,在需要时给字符型指针赋值:在需要时给字符型指针赋值:char *cp,str =” Hello china!”; cp=str;字符指针就是指向字符类型数据的指针字符指针就是指向字符类型数据的指针str或者或者cp=Hello China;字符数组与字符指针的区别字符数组与字符指针的区别定义和初始化方法不同定义和初始化方法不同 char *pStr = Hello China;Hello ChinapStrchar str12 = Hello China; char *pStr;pSt
8、r = Hello China;strpStr = &str0;赋值方法不同赋值方法不同 str = Hello China;Hello Chinachar str12 = Hello China; char *pStr;pStr = Hello China;数组名数组名str是地址常量是地址常量 字符指针字符指针pStr是变量是变量 字符数组与字符指针的区别字符数组与字符指针的区别 char *cp; 与与 char str20;vchar str20; str=“I love China!”; ( ) char *cp; cp=“I love China!”; ( )vcp接受键入字符串时
9、接受键入字符串时,必须必须先开辟存储空间先开辟存储空间例例 char str10; scanf(“%s”,str); ( )而而 char *cp; scanf(“%s”, cp); ( )改为改为: char *cp,str10; cp=str; scanf(“%s”,cp); ( )字符数组与字符针的区别字符数组与字符针的区别 课堂练习分别利用字符数组和字符指针的方式储存字符串”Hohai University”,并将字符串中的小写字母变成大写字母。char *pStr = Hello China;char str12 = Hello China; 6.4 6.4 字符串数组字符串数组(1
10、) 用用字符型二维数组字符型二维数组表示字符串数组表示字符串数组(2) 用用字符型指针数组字符型指针数组表示字符串数组表示字符串数组当有多个字符串时,如何处理,比如:当有多个字符串时,如何处理,比如:“MON”,“TUE”,“WED”,“THU”,“FRI”char *pStr = “MON;char str12 = “MON; 6.4.1 6.4.1 用字符型二维数组表示字符串数组用字符型二维数组表示字符串数组char astrMN;astr可以看做一个字符串数组。可以看做一个字符串数组。存储存储M个字符串,每一行就是一个字符串。个字符串,每一行就是一个字符串。每一个字符串最多可以存储每一个
11、字符串最多可以存储N-1个字符。个字符。char a74=SUN,MON,TUE,WED,THU,FRI,SAT; 定义了定义了7个字符串,每个字符串最多可以有三个有效字符。个字符串,每个字符串最多可以有三个有效字符。char b 8=well,good,middle,pass,bad; 定义了定义了5个字符串,每个字符串最多可以有个字符串,每个字符串最多可以有7个字符。个字符。6.4.26.4.2用字符型指针数组表示字符串数组用字符型指针数组表示字符串数组char *pstr3 = Wuhan, Beijing, Shanghai;astr0Wuhan00000astr1Beijing000
12、astr2Shanghai00char astr310=Wuhan, Beijing, Shanghai;pstr0Wuhan 0 pstr1Beijing 0 pstr2Shanghai0PascalBasicFortranJavaptr指针数组指针数组字符串字符串pVisual Cv二级指针与指针数组的关系二级指针与指针数组的关系 int *p; int *q = Pascal,Basic,Fortran“; l指针数组名是二级指针指针数组名是二级指针常量常量lp=q; p+i 是是qi的地址的地址l指针数组作形参,指针数组作形参,int *q 与与int *q完全等价完全等价; 但但作为
13、变量定义两者不同作为变量定义两者不同l系统只给系统只给p分配能保存一个指针值的内存区;而给分配能保存一个指针值的内存区;而给q分配分配3块内存区,每块可保存一个指针值块内存区,每块可保存一个指针值逐个输出逐个输出for (i=0; stri!=0; i+) putchar(stri);putchar(n);一般不用字符串长度控制一般不用字符串长度控制6.5 6.5 字符串的输入输出字符串的输入输出 char str10;一次性输入输出一次性输入输出scanf(%s,str); printf(%s,str);char str10;gets(str); puts(str);不能输入带空格的字符串不
14、能输入带空格的字符串可以输入带空格的字符串可以输入带空格的字符串6.5 6.5 字符串的输入输出字符串的输入输出 scanf()函数函数格式:格式:scanf(%s, str) 功能:从键盘输入一以空格或回车结束的字符串放入字符串中,功能:从键盘输入一以空格或回车结束的字符串放入字符串中,并自动加并自动加0说明:说明: 输入串长度应小于字符数组维数,输入串长度应小于字符数组维数,str可以是字符数组名,也可以是字符数组名,也可以是字符指针名可以是字符指针名。如果是字符指针名,必须先为字符指针分配。如果是字符指针名,必须先为字符指针分配空间。空间。 输入串中的前导空格忽略,中间的空格作为输入结束
15、标志输入串中的前导空格忽略,中间的空格作为输入结束标志例如:例如:char str80; scanf (%s, str);当输入:当输入:hellochina 时,时,str将是:将是:hello说明:说明: (3 3)如果利用一个)如果利用一个scanfscanf函数输入多个字符串,则函数输入多个字符串,则在输入时以空格分隔。在输入时以空格分隔。例如:例如:char strlchar strl5 5,str2str25 5,str3str35 5; ;scanf(%s%s%sscanf(%s%s%s,str1str1,str2str2,str3);str3);输入数据:输入数据:How ar
16、e you? How are you? 数组中未被赋值的元素的值自动置数组中未被赋值的元素的值自动置00。getsgets函数函数格式:格式:gets(str) 头文件:头文件:stdio.h 功能:从键盘输入一以回车结束的字符串放入字符功能:从键盘输入一以回车结束的字符串放入字符数组中,并自动加数组中,并自动加0说明:输入串长度应小于字符数组长度说明:输入串长度应小于字符数组长度例如:例如:char str80; gets (str);输入:输入:Ilovechina! str中的字符串将是:中的字符串将是:I love china!putsputs函数函数格式:格式:puts(字符串地址字
17、符串地址) 头文件:头文件:stdio.h 功能:向显示器输出字符串(输出完,自动换行)功能:向显示器输出字符串(输出完,自动换行)说明:如果是字符数组,则必须以说明:如果是字符数组,则必须以0结束结束char str = I love china! ;puts (str);puts (I love Nanjin! ); 输出结果输出结果: I love china! I love Nanjin!printf()printf()函数函数格式:格式:printf(%s, 字符串地址字符串地址) 功能:依次输出字符串中的每个字符直到遇到字符功能:依次输出字符串中的每个字符直到遇到字符0 (0不会被
18、输出)不会被输出)说明:说明:(1 1)用)用“%s”%s”格式符输出字符串时,格式符输出字符串时,printfprintf函数中的函数中的输出项是字符数组名。输出项是字符数组名。(2 2)如果数组长度大于字符串实际长度,也只输出到)如果数组长度大于字符串实际长度,也只输出到遇遇00结束。结束。(3 3)输出字符不包括结束符)输出字符不包括结束符00。(4 4)如果一个字符数组中包含一个以上)如果一个字符数组中包含一个以上00,则,则遇第一个遇第一个00时输出就结束。时输出就结束。 课堂练习课堂练习 设设char s180, s180; 分别利用分别利用scanf和和gets函数对函数对s1,
19、s2初始化,初始化, 并利用并利用printf和和puts函数输出字符串函数输出字符串s1,s2的内容的内容课堂练习课堂练习 设设char s = Hello China; 定义函数定义函数int strlength(char *str),求解字符串的长度,求解字符串的长度 设设char s110; char s2=Hello China; 定义函数定义函数void strcpy(char s1,char s2),将字符串,将字符串s2的内容拷贝到字符串的内容拷贝到字符串s1中中字符串处理库函数字符串处理库函数#include strcpy(目的字符串目的字符串,源字符串源字符串);strin
20、g copystrlen(字符串字符串);string lengthstrcat(目的字符串目的字符串,源字符串源字符串);string combinationstrcmp(字符串字符串1,字符串字符串2);string comparison1. 1.求字符串长度求字符串长度函数原型:函数原型:int strlen(const char s) 头文件:头文件:string.h 功能:计算字符串长度功能:计算字符串长度返回值:返回字符串实际长度,不包括返回值:返回字符串实际长度,不包括0在内在内char str10 = China;printf(%d, strlen(str);打印结果是打印结果
21、是 5 5,6 6,还是,还是1010?不包括不包括00的实际字符的个数的实际字符的个数字符串操作的基本库函数字符串操作的基本库函数【例例6-76-7】( (strlenstrlen函数函数与与sizeofsizeof运算符运算符的比较的比较) )对照下面的程序及结果,分析原因。对照下面的程序及结果,分析原因。#include#includevoid main()char str1 = 0123456789;char str2 = A0BC0D;printf (%4d, %4dn, strlen(str1),sizeof(str1); printf (%4d, %4dn, strlen(str
22、2),sizeof(str2); 运行结果运行结果 10, 11 1, 7 /*遇到结束符遇到结束符0,就结束,就结束*/ 2. 2.字符串复制字符串复制#include strcpy(目的字符串目的字符串,源字符串源字符串);字符串能否用字符串能否用= =整体复制?整体复制?str2 = str1;strcpy(str2, str1);注意复制的方向!注意复制的方向!str2必须足够大!必须足够大!字符串复制字符串复制char str120, str220=China ,*str3;strcpy(str1, str2); strcpy(str3,str2); str3 = str2;3. 3
23、.字符串比较字符串比较#include strcmp(字符串字符串1,字符串字符串2);字符串能否用字符串能否用,=比较大小?比较大小?if (str2 = str1)if (strcmp(str2, str1) = 0)字符串比较字符串比较#include strcmp(s1,s2);字符串是如何比较大小的?字符串是如何比较大小的?当出现第一对不相等的字符时,就当出现第一对不相等的字符时,就由这两个字符决定所在字符串的大由这两个字符决定所在字符串的大小,返回其小,返回其ASCIIASCII码比较的结果值码比较的结果值comparecomputerstrcmp(compare, compute
24、r)返回负整数返回负整数若若s1 s2, 返回正整数返回正整数若若s1 = s2, 返回零返回零compare computer 表示为表示为strcmp(str1, str2) 0为真为真4. 4.字符串连接字符串连接#include strcat(目的字符串目的字符串,源字符串源字符串);strcat(str2, str1);str2必须足够大!必须足够大!字符串逆置字符串逆置整数转换成字符串整数转换成字符串字符串排序字符串排序单词分离单词分离6.7 6.7 字符串应用举例字符串应用举例字符串逆置字符串逆置对于给定的字符串对于给定的字符串s,将其逆序,即如果将其逆序,即如果s=”abcde
25、f”,则逆,则逆序后的字符串是序后的字符串是s=”fedcba”算法算法1:数组方式实现:数组方式实现void str_reverse(char *s) char t; int low=0,high; high=strlen(s)-1; while(lowhigh) t=slow; slow=shigh; shigh=t; low+; high-; 算法算法2:指针方式实现:指针方式实现void str_reverse(char *s) char *p,*q,t; int n; n=strlen(s); p=s; q=&sn-1; while(pq) t=*p; *p=*q; *q=t; p+
26、; q-; Ba0427 MOD 16 = B 427 16 =2626 MOD 16 = A26 16= 1A a11 a2 1 MOD 16 = 11 16 = 0C0C1C2C3C4C5C6C7C8C9C10C11C12C13C14C15S0S1S2S3S4S5S6S7S8S9S10S11S12S13S14S1516427261010111(427)10=(1AB)1616BA116数制转换数制转换把一个十进制整数转换为对应的十六进制数字把一个十进制整数转换为对应的十六进制数字符串输出。符串输出。 此函数用于把十进制整数此函数用于把十进制整数x x转换为十六进制数字符串输出转换为十六进制
27、数字符串输出char *dec2hex(int x,char a ) int i=0,rem; do rem=x%16;x=x/16;if(rem10) ai=48+rem; /0字符的字符的ASCII码为码为48else ai=55+rem; /A字符的字符的ASCII码为码为65i+;while(x!=0);ai=0; /字符串结束标记字符串结束标记str_reverse(a); /倒序输出,倒序输出,调用调用串逆置函数串逆置函数 return a;char *Int2Str(int x,char *istr) char sign,ch; char *p,*t; int r; p=t=is
28、tr; if(x0) r=x%10; x=x/10; *p=48+r;/*数字数字0的的ascII码值码值 */ p+; 整数转换成字符串整数转换成字符串 if(sign=-) *p+=-; *p=0; p-; while(tp) /*将将p中的数字符串倒序排列中的数字符串倒序排列 */ ch=*t; *t=*p; *p=ch; t+; p-; return istr;main( ) char b30; int x=123,y=-321; printf(%sn,Int2Str(x,b) ); printf(%sn,Int2Str(y,b) );void main(void)char *str=
29、Follow me,BASIC,Great wall,FORTRAN , Computer ; char *p; int i,j,k;for(i=0;i4;i+) k=i;for(j=i+1;j0)k=j;if(k!=i) p=strk; strk = stri; stri=p; for(i=0;i5;i+)printf(%s n,stri); 例:将若干个字符串升序排序后输出例:将若干个字符串升序排序后输出例例 对字符串排序(简单选择排序)对字符串排序(简单选择排序)#include #include main() void sort(char *name,int n); void prin
30、t(char *name,int n); char *name=Follow me,BASIC, Great Wall,FORTRAN,Computer ; int n=5; sort(name,n); print(name,n);void sort(char *name,int n) char *temp; int i,j,k; for(i=0;in-1;i+) k=i; for(j=i+1;j0) k=j; if(k!=i) temp=namei; namei=namek; namek=temp; name0name1name2name3name4nameGreat WallFORTRAN
31、ComputerFollow meBASICkjkjjji=0例例 对字符串排序(简单选择排序)对字符串排序(简单选择排序)namename0name1name2name3name4Great WallFORTRANComputerFollow meBASICkkjjji=1k#include #include main() void sort(char *name,int n); void print(char *name,int n); char *name=Follow me,BASIC, Great Wall,FORTRAN,Computer ; int n=5; sort(name,
32、n); print(name,n);void sort(char *name,int n) char *temp; int i,j,k; for(i=0;in-1;i+) k=i; for(j=i+1;j0) k=j; if(k!=i) temp=namei; namei=namek; namek=temp; 例例 对字符串排序(简单选择排序)对字符串排序(简单选择排序)namename0name1name2name3name4Great WallFORTRANComputerFollow meBASICkkjji=2#include #include main() void sort(cha
33、r *name,int n); void print(char *name,int n); char *name=Follow me,BASIC, Great Wall,FORTRAN,Computer ; int n=5; sort(name,n); print(name,n);void sort(char *name,int n) char *temp; int i,j,k; for(i=0;in-1;i+) k=i; for(j=i+1;j0) k=j; if(k!=i) temp=namei; namei=namek; namek=temp; 例例 对字符串排序(简单选择排序)对字符串
34、排序(简单选择排序)namename0name1name2name3name4Great WallFORTRANComputerFollow meBASICi=3kjk#include #include main() void sort(char *name,int n); void print(char *name,int n); char *name=Follow me,BASIC, Great Wall,FORTRAN,Computer ; int n=5; sort(name,n); print(name,n);void sort(char *name,int n) char *tem
35、p; int i,j,k; for(i=0;in-1;i+) k=i; for(j=i+1;j0) k=j; if(k!=i) temp=namei; namei=namek; namek=temp; name0name1name2name3name4void print(char *name ,int n) int i; char *p; p = name; for (i=0; in; i+) printf(%sn, *p); p+; 例例 对字符串排序(简单选择排序)对字符串排序(简单选择排序)单词分离单词分离 分析:分析:英文句子英文句子是由是由单词单词和和分隔符分隔符组成,英文句子组成
36、,英文句子中的中的分隔符主要有分隔符主要有空格空格,逗号逗号,句号句号等等,除了第一,除了第一个单词和最后一个单词外,中间任何一个单词的两个单词和最后一个单词外,中间任何一个单词的两边各有一个或者多个分隔符。边各有一个或者多个分隔符。单词分离单词分离 由于判断字符串中的字符由于判断字符串中的字符是否是分隔是否是分隔符符是一个独立的且频繁使用的功能,是一个独立的且频繁使用的功能,将其将其写成一个独立函数写成一个独立函数。 词汇提取词汇提取过程由左向右进行,遇到分过程由左向右进行,遇到分隔符不做处理,隔符不做处理,遇到非分隔符,将其遇到非分隔符,将其放在字符串放在字符串tokentoken之中之中
37、。 为了使算法简洁,为了使算法简洁,每次只提取一个单每次只提取一个单词词。使用时,循环调用函数。使用时,循环调用函数gettokengettoken,就可提取出所有的词汇。就可提取出所有的词汇。算法思路:算法思路:单词分离单词分离/* 分隔符判断函数分隔符判断函数判断字符判断字符ch是否是一个分隔符是否是一个分隔符,所有可能的分隔所有可能的分隔符都放在字符串符都放在字符串di中,中,如果是如果是ch是是di中的某一个字符,则返回中的某一个字符,则返回1,否则返回,否则返回0 */static int isdelimeter(char *di,char ch) while(*di) if(ch=
38、*di) return 1; else di+; return 0;单词分离单词分离/* 函数名:函数名:gettoken,算法主函数,算法主函数,提取英文单词。提取英文单词。参数:英文句子放在参数:英文句子放在字符串字符串buf中,所有中,所有分隔符放在字符串分隔符放在字符串di中。中。返回值:返回值是一个字符型指针,表示所提取的单词,如果句子中的返回值:返回值是一个字符型指针,表示所提取的单词,如果句子中的所有单词都已经提取出来,则返回值是所有单词都已经提取出来,则返回值是NULL。*/char *gettoken(const char *buf,char *di) static int
39、pos=0; static char token80; char *tmp=NULL; if(bufpos=0) return tmp; tmp=token; *tmp=0; while(bufpos!=0 & isdelimeter(di,bufpos) /*是分隔符,跳过是分隔符,跳过*/ pos+; while(bufpos!=0 & !isdelimeter(di,bufpos) /*非分隔符,处理非分隔符,处理*/ *tmp=bufpos; pos+; tmp+; *tmp=0; if(token0=0) return NULL; else return token;单词分离单词分离main() char str= we are students,we love studing! ; char *p; int cnt=0; while(p=gettoken(str,!, ) printf(%sn,p); cnt+; printf(单词个数单词个数=%dn,cnt);
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。