《C语言新教材PPT课堂课件-字符串处理》由会员分享,可在线阅读,更多相关《C语言新教材PPT课堂课件-字符串处理(42页珍藏版)》请在金锄头文库上搜索。
1、C语语言言实实训训字字符符串串处处理理 常常用用的的字字符符串串处处理理函函数数: 字字符符串串输输出出函函数数:puts( )puts( ) 字字符符串串输输入入函函数数:gets( )gets( ) 字字符符串串拷拷贝贝函函数数:strcpystrcpy( )( ) 字字符符串串连连接接函函数数:strcatstrcat( )( ) 字字符符串串比比较较函函数数:strcmpstrcmp( )( ) 字字符符串串长长度度函函数数:strlenstrlen( )( ) 字字符符串串大大小小写写转转换换函函数数strlwrstrlwr( )( )和和struprstrupr( ) ( ) #i
2、nclude #include string.hstring.h 字字符符串串处处理理函函数数#include #include stdio.hstdio.h puts( )puts( )函函数数字字符符串串输输出出函函数数n格格式式:puts(puts(字字符符串串) )n功功能能:将将指指定定的的字字符符串串输输出出到到标标准准输输出出设设备备可可为为串串常常量量、字字符符数数组组名名和和有有明明确确指指向向的的字字符符指指针针变变量量名名说说明明: : (1) (1) 在在输输出出时时遇遇到到00时时结结束束输输出出并并将将00作作为为回回车车换换行行(n)(n)处处理理; ; (2)
3、(2) 输输出出的的字字符符串串中中可可以以包包含含转转义义字字符符. .用用scanfscanf输输入入字字符符串串无无此此功功能能gets( )gets( )函函数数字字符符串串输输出出函函数数n格格式式:gets(gets(串串地地址址) )n功功能能:从从键键盘盘上上输输入入一一个个字字符符串串到到指指定定地地址址开开始始的的存存储储空空间间中中。注注意意:该该地地址址开开始始的的存存储储空空间间必必须须已已分分配配且且足足够够大大,以以便便容容纳纳所所输输入入的的字字符符串串说说明明: : (1 1)输输入入时时以以回回车车键键作作为为字字符符串串输输入入结结束束标标志志,并并将将该
4、该符符号号转转换换为为字字符符串串结结束束标标志志00存存入入存存储储单单元元。 (2 2)输输入入的的字字符符串串中中不不可可以以包包含含转转义义字字符符。可可为为字字符符数数组组名名、有有明明确确指指向向的的字字符符指指针针或或字字符符数数组组元元素素地地址址strcpystrcpy( )( )函函数数字字符符串串拷拷贝贝函函数数n格格式式: strcpy(str1,str2): strcpy(str1,str2)n功功能能:将将字字符符串串2 2(连连同同结结束束标标志志00)拷拷贝贝到到串串1 1地地址址所所指指的的存存储储空空间间中中。字字符符串串地地址址,可可以以是是字字符符数数组
5、组或或字字符符指指针针变变量量注注意意:str1str1所所指指的的存存储储空空间间必必须须足足够够大大,以以便便容容纳纳字字符符串串2 2;如如果果str1str1是是字字符符指指针针变变量量,要要保保证证str1str1已已经经赋赋值值。a b c d e 0 0 0 0 000strcpystrcpy( )( )函函数数的的使使用用1 1main( ) char c120=abcde, *c2=123456789; strcpy( c1 , c2 ) ;1 2 3 4 5 6 7 8 9 01 2 30 puts( c1 ); puts( c2 ); 123456789123456789
6、4 5 6 7 8 9c1:C2a b c d e 0 0 0 0 000strcpystrcpy( )( )函函数数的的使使用用2 2main( ) char c120=abcde, c210=123; strcpy( c1 , c2 ) ;1 2 3 0 0 0 0 0 001 2 3 0 puts( c1 ); puts( c2 ); 123123c1:c2:例例:编编程程实实现现strcpystrcpy函函数数的的功功能能#include #include main( )main( ) char s1=Hello,World!,s215; char s1=Hello,World!,s2
7、15; char *from=s1,*to=s2; char *from=s1,*to=s2; while(*from) while(*from) *to=*from; to+; from+; *to=*from; to+; from+; *to=0; *to=0; puts(s1); puts(s1); puts(s2); puts(s2); * *to+ = *from+; to+ = *from+; strcmpstrcmp( )( )函函数数字字符符串串比比较较函函数数n格格式式:strcmpstrcmp( (串串1,1,串串2)2)n功功能能:比比较较字字符符串串1 1和和字字符符串
8、串2 2的的大大小小n返返回回值值:返返回回两两个个字字符符串串中中第第一一对对不不同同字字符符的的ASCIIASCII码码值值之之差差。n字字符符串串的的比比较较:逐逐个个字字符符比比较较;按按ASCIIASCII码码比比较较;遇遇到到第第一一个个不不同同的的字字符符或或者者有有一一个个字字符符串串结结束束停停止止。strcmp( abcde , ad )结结果果:b-d= -2ad0abcde0strcmp( abcde , ab )结结果果:c-0= 99ab0abcde0strcmp( ab , ab )结结果果:0-0=0ab0ab 0例例 编编程程实实现现strcmpstrcmp函
9、函数数的的功功能能(用用字字符符数数组组)#include #include “stdio.hstdio.h”main()main() char s120,s220; char s120,s220; intint i,cmpi,cmp; ; gets(s1); gets(s2); gets(s1); gets(s2); for(ifor(i=0;s1i!=0&s2i!=0;i+)=0;s1i!=0&s2i!=0;i+) cmpcmp=s1i-s2i;=s1i-s2i; if(cmpif(cmp!=0) break;!=0) break; if(cmpif(cmp=0) =0) cmpcmp=s
10、1i-s2i;=s1i-s2i; printfprintf( (“两两串串比比较较的的结结果果是是:% %dn,cmpdn,cmp);); for(ifor(i=0;s1i!=0|s2i!=0;i+)=0;s1i!=0|s2i!=0;i+) cmpcmp=s1i-s2i;=s1i-s2i; if(cmpif(cmp!=0) break;!=0) break; 例例 编编程程实实现现strcmpstrcmp函函数数的的功功能能(用用字字符符指指针针)#include #include “stdio.hstdio.h”main( )main( ) char s120,s220; char *str
11、1=s1,*str2=s2; char s120,s220; char *str1=s1,*str2=s2; intint cmpcmp; ; gets(str1); gets(str2); gets(str1); gets(str2); for( ; *str1|*str2; str1+,str2+)for( ; *str1|*str2; str1+,str2+) cmpcmp=*str1-*str2;=*str1-*str2; if(cmpif(cmp!=0) break;!=0) break; printfprintf( (“两两串串比比较较的的结结果果是是:% %dn,cmpdn,cm
12、p);); strcatstrcat( )( )函函数数字字符符串串连连接接函函数数n格格式式: strcat(str1,str2): strcat(str1,str2)n功功能能:将将字字符符串串2 2(连连同同结结束束标标志志00)接接到到字字符符串串1 1的的后后面面(00位位置置开开始始) 。字字符符串串地地址址,可可以以是是字字符符数数组组或或字字符符指指针针变变量量注注意意:str1str1所所指指的的存存储储空空间间必必须须足足够够大大,以以便便容容纳纳连连接接后后的的新新字字符符串串;如如果果str1str1是是字字符符指指针针变变量量,要要保保证证str1str1已已经经赋赋
13、值值。strcatstrcat()()函函数数的的使使用用main( ) char c120=abcde, *c2=12345; strcat( c1 , c2 ) ;1 2 3 4 5 0a b c d e 0 0 0 0 0001 2 3 4 5 0 puts( c1 ); puts( c2 ); abcde1234512345c1:c2例例 编编程程实实现现strcatstrcat函函数数的的功功能能 j=0j=0定定义义一一维维字字符符数数组组str1str1、str2str2并并输输入入字字符符串串str1str1、str2str2当当str2j!= 0str2j!= 0 输输出出s
14、tr1str1、str2str2 i+i+ i=0i=0 str1i= 0str1i= 0 str1i=str2jstr1i=str2j i+, j+ i+, j+ 当当str1i!= 0str1i!= 0#include #include “stdio.hstdio.h”main()main() char s1100,s250; char s1100,s250; intint i=0,j=0; i=0,j=0; printf(printf(“pleaseplease input s1 and s2:n input s1 and s2:n”);); gets(s1); gets(s2); ge
15、ts(s1); gets(s2); while(s1i!= while(s1i!=00) i+;) i+; while(s2j!= while(s2j!=00) s1i=s2j; i+; j+; ) s1i=s2j; i+; j+; s1i= s1i=00; ; puts(s1); puts(s1); 数数组组方方法法#include #include “stdio.hstdio.h” main()main() char s1100,s250,*p1=s1,*p2=s2; char s1100,s250,*p1=s1,*p2=s2; printf(printf(“pleaseplease in
16、put s1 and s2:n input s1 and s2:n”);); gets(s1); gets(s2); gets(s1); gets(s2); while(*p1!= while(*p1!=00) p1+;) p1+; for(;*p2!= for(;*p2!=00;p1+,p2+) *p1=*p2; ;p1+,p2+) *p1=*p2; *p1= *p1=00; ; puts(s1); puts(s1); 指指针针方方法法strlenstrlen( )( )函函数数求求字字符符串串长长度度函函数数n格格式式: strlenstrlen( (字字符符串串) )n功功能能: 求求字
17、字符符串串的的实实际际长长度度, ,不不包包括括00。n返返回回值值:返返回回整整型型数数据据,其其大大小小为为字字符符串串中中有有效效字字符符的的个个数数。strlenstrlen( )( )函函数数的的使使用用#include string.hmain ( ) char c110=abcdefg ; char *c2=123; printf(%st%dn,c1,strlen(c1); printf(%st%dn,c2,strlen(c2);abcdefg 7123 3例例 将将小小写写字字母母串串转转换换为为大大写写字字母母串串main ( ) char c80 ; int i ; get
18、s(c); puts(c) ; for( i=0 ; ci!=0 ; i+ ) ci = ci - 32 ; puts(c) ; 从从键键盘盘上上输输入入一一行行由由小小写写字字母母组组成成的的字字符符串串,转转换换成成大大写写字字母母输输出出。istrlen(c)不不能能用用 i80strlwrstrlwr( )( )函函数数大大写写字字母母转转换换成成小小写写字字母母n格格式式: strlwrstrlwr( (字字符符串串) )n功功能能: 将将字字符符串串中中的的大大写写字字母母转转换换成成小小写写字字母母,其其它它字字符符不不变变struprstrupr( )( )函函数数小小写写字字
19、母母转转换换成成大大写写字字母母n格格式式: struprstrupr( (字字符符串串) )n功功能能: 将将字字符符串串中中的的小小写写字字母母转转换换大大写写字字母母,其其它它字字符符不不变变常常用用函函数数介介绍绍复制nchar*strcpy(char*s1,constchar*s2);将字符串s2复制到s1指定的地址nchar*strncpy(char*s1,constchar*s2,size_tlen);将s2的前len个字符(字节)复制到s1中指定的地址,不加0连接nchar*strcat(char*s1,constchar*s2);将字符串s2连接到s1尾部nchar*strn
20、cat(char*s1,constchar*s2,size_tlen);将字符串s2的前len个字符连接到s1尾部,不加0比较nintstrcmp(constchar*s1,constchar*s2);比较字符串s1和s2nintstrncmp(constchar*s1,constchar*s2,size_tlen);对s1和s2的前len个字符(字节)作比较查找nchar*strchr(constchar*s,intch);在s中查找给定字符(字节值)ch第一次出现的位置nchar*strrchr(constchar*s,intch);在串s中查找给定字符ch最后一次出现的位置,r表示从串尾
21、开始nchar*strstr(constchar*s1,constchar*s2);在串s1中查找指定字符串s2第一次出现的位置字符转换n所谓字符转换就是将字符按照某种规律转换成对应的字符曾经最难的问题(HDU1048)题目描述:恺撒大帝生活在充满危险和阴谋的时代。恺撤大帝面临最严峻的形势就是如何生存下去,为了生存,他决定设计一种密码。这种密码设计得是如此难以置信的合理,以至于不知道它的原理就无法破译。你是恺撒军队的一个小队长。你的工作就是对恺撒发布的密文进行解码,然后告诉军头的司令官。加密的规则其实很简单:对原文中的每个字母,转换成字母表后面第5个字母,如原文中的字符为字母A,则密文中对应的
22、字符为F。因为你的工作是解码,所以要将密文文翻译成原文。ciphertext(密文):ABCDEFGHIJKLMNOPQRSTUVWXYZplaintext(原文):VWXYZABCDEFGHIJKLMNOPQRSTU加密时,只有字母字符才按照上述规则进行加密。任何非字母字符保持不变,而且所有享母字符均为大写字母。输入数据:输入文件(非空)最多包含100组数据。每组数据为下面的格式,每组数据之间没有空行,所有的字符为大写。每组数据由3行组成:(1)首行为字符串START;(2)第2行为密文,包含的字符个数大于等于1,小于等于200,表示恺撒发布的密文;(3)第3行为字符串END。最后一组数据后
23、有ENDOFINPUT,表示输入结束。输出描述:对每组数据,输出一行,为你解密出来的原文。输输入入数数据据:输输入入文文件件一一行行,包包含含的的字字符符个个数数大大于于等等于于1,小小于于等等于于200,表表示示恺恺撒撒发发布布的的密密文文;输输出出描描述述:输输出出一一行行你你解解密密出出来来的的原原文文。Sample Input NS BFW, JAJSYX TK NRUTWYFSHJ FWJ YMJ WJXZQY TK YWNANFQ HFZXJX Sample OutputIN WAR, EVENTS OF IMPORTANCE ARE THE RESULT OF TRIVIAL C
24、AUSES题目分析n分析本题针对的大写字母,把每个字母转换成字母表前5个字母,形成环状序列。F转换成AG转换成B,Z转换成U,A、B、C、D、E分别转换成V、W、X、Y、Z。n转换公式:ai=(ai-5+65)%26+65;或者ai=(ai+21-65)%26+65;温馨提示:A在ASCII码中是65gets(a);int i = 0;while(ai != 0)if(ai = A & ai = Z)ai = (ai+21-65)%26 + 65;i+;puts(a);回文的判断与处理所谓回文(palindrome)字符串,就是从左向右读和从右向左读结果相同的字符串。判断回文的方法很简单,假设
25、字符串长度为n,只需依次判断字符串中第i个字符与第n-l-i个字符是否相等即可,i=0,1,2,3,n/2。char s1000,*p1, *p2;int i, t = 1;p1 = s;p2 = s+strlen(s)-1;for(i = 0; i strlen(s)/2; i+)if(*p1 != *p2)t = 0; break;p1+;p2-;子串处理n字符串中任意一个连续的字符组成的字符序列被称为该字符串的子串。有时,从字符串中抽取不连续的字符所组成的字符序列,也可以看成是字符串的子串。字符串的包含问题题题目目描描述述:给定两个字符串s和t,判断s是否是t的子串,也就是说,是否能通过
26、从t中去掉一些字符,使得剩余的字符构成的字符串为s。 输输入入描描述述:输入文件占一行,为两个字符串s和t,这两个字符串是由大小写字母字符构成的,两个字符串之间用空格隔开。 输输出出描描述述:对输入数据,判断s是否为t的子串。是就输出“Yes”,不是就输出“No”样样例例输输入入:personcompressionabcbabce样样例例输输出出:NoYes题目分析对字符串s的第0个字符s0,在字符串t中进行查找,假设查找到,其第一次出现的位置为t0;在字符串t的t0下一个位置继续查找s1,假设查找到,其(第一次出现的)位置为t1;在字符串t的t1下一个位置继续查找s2。如果都能查找到s中的每
27、个字符,则s是t的“子串”;否则如果s中后面某些字符在t中没有找到对应的字符,则s不是t的“子串”。例如,对样例输入中的第1个测试数据,按照上述方式在字符串t中查找到字符串s中的前两个字符s0和s1后,后面的4个字符没能在t中查找到,所以s不是t的“子串”。相反,在第2个测试数据中,在t中都能查找到s中的每个字符,所以s是t的“子串”。char s1000;char t1000;int ls, lt;int ps, pt;ls = strlen(s);lt = strlen(t);for(ps = pt = 0; ps ls & pt lt; pt+) if(sps = tpt)ps+;if(ps ls)puts(No);elseputs(Yes);