《C语言基础 模块4 part2.ppt》由会员分享,可在线阅读,更多相关《C语言基础 模块4 part2.ppt(29页珍藏版)》请在金锄头文库上搜索。
1、上页上页 下页下页节节末页末页结束结束1 1 字符与字符串字符与字符串 2 2 字符数组字符数组 3 3 字符串处理函数字符串处理函数4 4 二维字符数组二维字符数组5 5 应用实例应用实例2上页上页 下页下页节节末页末页结束结束符号常量:符号常量:以指定以指定符号符号代表其后的代表其后的 “一串字符一串字符” 格式:格式: # #define define 标识符标识符 常量常量1 1 字符与字符串字符与字符串一、字符型数据一、字符型数据可以是任意类型常量可以是任意类型常量字符常量:字符常量:以以 括起来的单个字符,括起来的单个字符, 开头的字符序列。开头的字符序列。 例:例:a a, ,
2、A A, , nn表示换行,表示换行, rr表示回车。表示回车。字符串常量:字符串常量:用双引号括起来的字符序列。用双引号括起来的字符序列。 例:例:”ChCh”,”123123”等。长度不限,末尾加等。长度不限,末尾加00字符变量:字符变量:存放字符常量的变量,用存放字符常量的变量,用charchar说明。说明。3上页上页 下页下页节节末页末页结束结束1 1 字符与字符串(续)字符与字符串(续)二、字符串二、字符串 串长串长:字符串中所包含的字符数。:字符串中所包含的字符数。 串结束标记串结束标记:字符:字符 00 称为称为串结束标记。串结束标记。C C中的串以中的串以 00 结束。结束。字
3、符串在数组中的存储格式字符串在数组中的存储格式字符串可以存在一个一维数组中,字符串中的字符串可以存在一个一维数组中,字符串中的一一个字符个字符占用字符数组中占用字符数组中一个字节一个字节,具有数组特性。,具有数组特性。字符串字符串实际实际占有单元的数量等于占有单元的数量等于字符串长度字符串长度+1+1。例如:要定义一个存放字符串例如:要定义一个存放字符串“CHINACHINA”的字符的字符数数 组组c c,应定义为:应定义为: char c6;char c6; 数组数组c c在内存中实际存放情况为:在内存中实际存放情况为:4上页上页 下页下页节节末页末页结束结束CHINA0c0 c1 c2 c
4、3 c4 c5串长串长=5=5三、字符数据的输入输出三、字符数据的输入输出 库函数:库函数: getchargetchar( ),( ),putchar(chputchar(ch) )从键盘上从键盘上读一个字符读一个字符1 1 字符与字符串(续)字符与字符串(续) 使用使用getchargetchar( )( )时,可以输入任何字符,允许时,可以输入任何字符,允许用户根据自己的要求进行控制与处理,串尾用户根据自己的要求进行控制与处理,串尾00要自要自己编程加入。其中己编程加入。其中 ENTERENTER 接受为接受为 r r(回车)。回车)。 格式化输入输出函数:格式化输入输出函数: scan
5、fscanf( )( );printfprintf( )( );”%c” ”%c” 5上页上页 下页下页节节末页末页结束结束 格式:格式: 数据类型数据类型 数组名数组名 维数说明维数说明;例:例:char char a a 4 4,b10; ,b10; char char c c 3 34 4;表示表示a a数组可以存放数组可以存放4 4个字符,个字符,c c数组可以存放数组可以存放1212个字符。个字符。 例:例:c34c34可存放三个字符串,每个字符串最多存放可存放三个字符串,每个字符串最多存放4 4个字符。个字符。 一维字符型数组作为一个一维字符型数组作为一个字符串变量字符串变量使用。
6、使用。 二维字符型数组相当于一个二维字符型数组相当于一个字符串数组字符串数组,每行存放,每行存放 一个字符串。一个字符串。2 2 字符数组(续)字符数组(续) 一、一维字符数组的定义一、一维字符数组的定义二、字符数组的用途二、字符数组的用途6上页上页 下页下页节节末页末页结束结束8-2 8-2 字符数组字符数组 三、一维字符数组的初始化三、一维字符数组的初始化用字符串对字符数组初始化,如:用字符串对字符数组初始化,如:char ch6=CHINA;char ch6=CHINA;char ch6=CHINA;char ch6=CHINA; /* /* 省略省略 */ */char char ch
7、ch =CHINA; =CHINA; /* /* 省略长度值省略长度值 */ */l字符数组初始化字符数组初始化 用单个字符对字符数组初始化,如:用单个字符对字符数组初始化,如:char ch6=C,H,I,N,A,0;char ch6=C,H,I,N,A,0;2 2 字符数组(续)字符数组(续)7上页上页 下页下页节节末页末页结束结束2 2 字符数组(续)字符数组(续) 四、一维字符数组的引用四、一维字符数组的引用如:如:char a10=CHINA2000char a10=CHINA2000”,b3=b3=“123123”; ;printf(printf(“%cn%cn”,a3);,a3)
8、;printf(printf(“%sn%sn”,a,a););l对于字符数组,不仅可以引用它的数组元素,也对于字符数组,不仅可以引用它的数组元素,也可以引用整个数组。可以引用整个数组。8上页上页 下页下页节节末页末页结束结束2 2 字符数组(续)字符数组(续) static char a3;static char a3; for (i=0;i3;i+) for (i=0;i3;i+) scanfscanf( ( %c %c ,&ai); ,&ai); for (i=0;i3;i+) for (i=0;i3;i+) printfprintf( ( %c %c ,ai);,ai); printfp
9、rintf( ( n n ); ); 输入数据顺序:输入数据顺序: d o s输出数据顺序:输出数据顺序: dos四、字符数组的输入与输出四、字符数组的输入与输出单字符输入输出(用格式符单字符输入输出(用格式符c c控制)控制)9上页上页 下页下页节节末页末页结束结束static char a7;static char a7;scanfscanf( ( %s %s ,a);,a); 2 2 字符数组(续)字符数组(续) 字符数组名指明数组首地址字符数组名指明数组首地址字符串输入输出(用格式符字符串输入输出(用格式符s s控制)控制)00不输出不输出只能输入不包括只能输入不包括空格空格、 t t
10、和和 n n的字符串的字符串自动在串尾加自动在串尾加00printfprintf( ( %s%sn n ,a);,a);10上页上页 下页下页节节末页末页结束结束五、字符串在数组中的存储格式五、字符串在数组中的存储格式 使用字符使用字符00作为字符串的结束标记,就作为字符串的结束标记,就使得使得C C语言语言对字符串的长度没有具体的限制对字符串的长度没有具体的限制,但字,但字符串的符串的最大长度最大长度不能超过存储它的字符不能超过存储它的字符数组的长度数组的长度,否则会造成数组越界错误。否则会造成数组越界错误。2 2 字符数组(完)字符数组(完) 00是在字符串存入字符数组是由系统自是在字符串
11、存入字符数组是由系统自动添加的,并不是字符串本身的一部分,在计算串动添加的,并不是字符串本身的一部分,在计算串长的时候并不包括长的时候并不包括 00。11上页上页 下页下页节节末页末页结束结束3 3 字符串处理函数字符串处理函数一、字符串输入输出函数一、字符串输入输出函数 gets (gets (字符数组名字符数组名);); 由终端输入字符串到字符数组,以换行结束由终端输入字符串到字符数组,以换行结束 返回字符数组的首地址返回字符数组的首地址puts (puts (字符数组名字符数组名);); 将以将以00结束的字符串输出到终端结束的字符串输出到终端 返回的函数值是字符数组的首地址返回的函数值
12、是字符数组的首地址12上页上页 下页下页节节末页末页结束结束3 3 字符串处理函数(续)字符串处理函数(续)格式:格式:strlenstrlen(x x);); 功能:功能:返回返回x x字符串中字符的个数(不字符串中字符的个数(不包括字符串结束符)。包括字符串结束符)。x x是字符串首地址,其形式可以是字符数组是字符串首地址,其形式可以是字符数组或字符指针,也可以是字符常量或字符指针,也可以是字符常量。二、求字符串长度的函数二、求字符串长度的函数13上页上页 下页下页节节末页末页结束结束3 3 字符串处理函数(续)字符串处理函数(续)格式:格式:strcatstrcat(字符数组字符数组1
13、1,字符数组,字符数组2 2);); 功能:功能:连接两个字符数组中的字符串,将串连接两个字符数组中的字符串,将串2 2接接在串在串1 1后,结果存放在字符数组后,结果存放在字符数组1 1中,返回的函数中,返回的函数值是字符数组值是字符数组1 1的首地址。的首地址。字符数组字符数组字符数组字符数组1 1 1 1的长度的长度的长度的长度不可缺省,足够大。不可缺省,足够大。三、字符串连接函数三、字符串连接函数四、字符串复制函数四、字符串复制函数格式:格式:strcpystrcpy(字符数组字符数组1 1,字符数组,字符数组2 2);); 功能:功能:将串将串2 2复制到串复制到串1 1数组中。数组
14、中。14上页上页 下页下页节节末页末页结束结束0x y. z程序程序# #include include void main( )void main( ) char char str1str1100,100,str2str2100;100;intint i, j; i, j;printfprintf ( (”Enter string 1:Enter string 1:”););gets (gets (str1str1););printfprintf ( (”Enter string 2:Enter string 2:”););gets (gets (str2str2););for ( i=0;
15、 for ( i=0; str1i!=str1i!=00; ; i+ i+ ) ) ; /* /* 确定确定00位置位置 */*/for (for ( j=0; ( j=0; (str1i=str2jstr1i=str2j) ) != != 00; i+, j+; i+, j+ ) ) ;printf(printf(”OutputOutput string 1:%sn string 1:%sn”, str1);, str1); l例例8 8 字符串连接。字符串连接。将串将串str2str2连接到串连接到串str1str1之后。之后。根据字符串中根据字符串中 0 0 的位置进行字符串连接。的位置
16、进行字符串连接。关键关键:要用:要用str2str2的的第第1 1个个字符覆盖字符覆盖str1str1的串结束标记的串结束标记00。aab c d e f g0b c d e f g0str2str1.算法:算法:1 1、查找查找str1str1的串结束标记的串结束标记002 2、从从str1str1的的00开始,将开始,将str2str2复制到复制到str1str1。3 3 字符串处理函数(续)字符串处理函数(续)15上页上页 下页下页节节末页末页结束结束l例例9 9 字符串复制。字符串复制。将字符串将字符串 str1str1 拷贝到串拷贝到串 str2str2 中。中。没有必要复制整个数组
17、,根据字符串中没有必要复制整个数组,根据字符串中 00 的位置,的位置,只对只对 0 0 前面的字符进行复制。前面的字符进行复制。# #include include void main ( )void main ( ) char char str1str1100, 100, str2str2100;100; intint i; i; printfprintf (Enter string 1:); (Enter string 1:); gets ( gets (str1str1); /* ); /* 输入字符串输入字符串str1 */str1 */ forfor (i=0; (str2 (i=
18、0; (str2i=i=str1str1ii) )!=!=00; i+) ; i+) ;/* /* 复制复制*/*/ printf(Outputprintf(Output string 2:%sn, str2); string 2:%sn, str2); ab. f g0ab. f g0str1str2.3 3 字符串处理函数(续)字符串处理函数(续)16上页上页 下页下页节节末页末页结束结束3 3 字符串处理函数(续)字符串处理函数(续)五、字符串比较函数五、字符串比较函数格式:格式:strcmpstrcmp(字符数组字符数组1 1,字符数组,字符数组2 2);); 功能:比较串功能:比较串
19、1 1和串和串2 2,返回结果为:,返回结果为:0-0-相等,正数相等,正数-串串1 1大,负数大,负数-串串2 2大大”abcabc” 与与 ”abcabc” ,相等相等”abcdabcd” 与与 ”abckabck”, ”abcdabcd” 小小”abcabc” 与与 ”abab”, ”abcabc” 大大比较原则:比较原则:按按ASCIIASCII码比较码比较17上页上页 下页下页节节末页末页结束结束l例例10 10 字符串比较。字符串比较。确定字符串大小的基本规则:确定字符串大小的基本规则: 按照串中按照串中对应位置对应位置字符的字符的ASCIIASCII码值码值的大小确定大小。的大小
20、确定大小。例如:例如:”a abcbc” ” ”b b” 因为字符因为字符 a a b ” ”ababa adefdef” ” 因为字符因为字符 c c a a #include ” #include ”stdio.hstdio.h” void main( ) void main( ) char str1100, str2100; char str1100, str2100; intint i; i;printfprintf (Enter string 1:); gets(str1); (Enter string 1:); gets(str1);printfprintf (Enter stri
21、ng 2:); gets(str2); (Enter string 2:); gets(str2); forfor ( i=0; ( i=0; (str1i(str1i=str2i) & str1i!=0str2i) & str1i!=0; ; i+);i+);ifif ( str1i( str1i=str2istr2i ) ) printfprintf (str1= =str2n); (str1= =str2n);else ifelse if ( (str1istr1i str2istr2i) ) printfprintf (str1str2n); (str1str2n); elseelse
22、printfprintf (str1str2n); (str1str2n); 3 3 字符串处理函数(续)字符串处理函数(续)18上页上页 下页下页节节末页末页结束结束8-3 8-3 字符串处理函数字符串处理函数六、大小写字母的转换六、大小写字母的转换 1 1 格式:格式:strlwr(xstrlwr(x) ) 功能:把地址为功能:把地址为x x的字符串中所有大写字母转换的字符串中所有大写字母转换成小写字母。成小写字母。x x可以是字符数组或字符指针,也可以是字符数组或字符指针,也可以是字符串常量。可以是字符串常量。调用形式:调用形式: strlwr(xstrlwr(x);); 2 2 格式:
23、格式:strupr(xstrupr(x) ) 功能:把地址为功能:把地址为x x的字符串中所有小写字母转换的字符串中所有小写字母转换成大写字母。成大写字母。x x可以是字符数组或字符指针,也可以是字符数组或字符指针,也可以是字符串常量。可以是字符串常量。调用形式:调用形式: strupr(xstrupr(x);); 3 3 字符串处理函数(完)字符串处理函数(完)19上页上页 下页下页节节末页末页结束结束8-2 8-2 字符数组字符数组 一、二维字符数组的定义一、二维字符数组的定义如:如:char a25,b37;char a25,b37;l与二维数值数组定义相同,但数据类型为与二维数值数组定
24、义相同,但数据类型为charchar4 4 二维字符数组二维字符数组20上页上页 下页下页节节末页末页结束结束8-2 8-2 字符数组字符数组 二、二维字符数组的初始化二、二维字符数组的初始化可以在定义的同时初始化,如:可以在定义的同时初始化,如: char a38= char a38=“str1str1“, ,”str2str2”, ,”string3string3”; char b 6= char b 6=“s1s1“, ,”s2s2”, ,”str3str3”;l二维字符数组初始化二维字符数组初始化4 4 二维字符数组(续)二维字符数组(续)l二维字符数组初始化在内存的存储二维字符数组初
25、始化在内存的存储str10000str20000string30a0a1a2a0021上页上页 下页下页节节末页末页结束结束8-2 8-2 字符数组字符数组 三、二维字符数组的引用三、二维字符数组的引用如:如:(1) (1) for (i=0;i3;i+) for (i=0;i3;i+) printf(printf(“%sn%sn”,ai,ai);); (2) for (i=0;i3;i+) (2) for (i=0;i3;i+) printf(printf(“%cn%cn”,aii,aii);); (3) for (i=0;i3;i+) (3) for (i=0;i3;i+) printf(
26、printf(“%sn%sn”,&aii+1);,&aii+1);l对于二维字符数组,每行可以看做一个字符数组。对于二维字符数组,每行可以看做一个字符数组。数组名数组名aiai。可以用可以用aiai引用引用i i行的字符串行的字符串, ,也可以也可以用用aijaij引用引用i i行行j j列列的字符。的字符。4 4 二维字符数组(完)二维字符数组(完)输出:输出:(1) (1) str1 (2) s (3) tr1str1 (2) s (3) tr1 str2 t r2 str2 t r2 strinf3 r ing3 strinf3 r ing322上页上页 下页下页节节末页末页结束结束#
27、#include include # #include include void main ( ) void main ( ) char string 100, t;char string 100, t;intint i, j, n; i, j, n;gets ( string );gets ( string );n = n = strlenstrlen ( string ); ( string );for ( i=0; in-1; i+ ) /* for ( i=0; in-1; i+ ) /* 冒泡法排序冒泡法排序 */ */for ( j=0; j n-1-i; j+ )for ( j=
28、0; j stringj+1 )if ( stringj stringj+1 ) t = stringj;t = stringj;stringj = stringj+1;stringj = stringj+1;stringj+1 = t;stringj+1 = t; puts ( string );puts ( string ); 4 4 应用实例应用实例例例11 11 输入一行字符,将其中的每个字符从小到大排列输入一行字符,将其中的每个字符从小到大排列后输出后输出。23上页上页 下页下页节节末页末页结束结束例例12 12 输入五个单词,请将它们按从小到大的顺序排列输入五个单词,请将它们按从小
29、到大的顺序排列后输出。后输出。 # #include include # #include include void main ( )void main ( ) char char strstr 520, t20; 520, t20; intint i, j, n; i, j, n; printfprintf (Enter string:n); (Enter string:n); for ( i=0; i5; i+) /* for ( i=0; i5; i+) /* 循环输入循环输入5 5个字符串个字符串 */ */ gets ( gets ( stristri ); ); for ( i=0
30、; i4; i+ ) for ( i=0; i4; i+ ) for (j=0; j 5-1-i; j+ ) for (j=0; j 0 ), strj+1) 0 ) strcpystrcpy ( t, ( t, strjstrj ); ); strcpystrcpy ( ( strjstrj, strj+1);, strj+1); strcpystrcpy ( strj+1, t); ( strj+1, t); printf(Result:nprintf(Result:n);); for ( i=0; i5; i+ ) puts ( for ( i=0; i5; i+ ) puts ( st
31、ristri ); ); 4 4 应用实例(续)应用实例(续)24上页上页 下页下页节节末页末页结束结束例例1313 任意输入任意输入一个一个3 3位整数位整数,取其各位数字的取其各位数字的和,再取这个和被和,再取这个和被7 7除的余数,输出余数除的余数,输出余数对应对应的的星期(英文单词)星期(英文单词)。如:输入如:输入123123,(,(1+2+31+2+3)%7=6%7=6,则输出,则输出saturdaysaturday。 对对3 3位整数位整数n n,拆分其百、十和个位的方法:拆分其百、十和个位的方法: 百位:百位:i=n/100; i=n/100; 十位:十位:j=n/10%10;
32、j=n/10%10; 个位:个位:k=n%10;k=n%10;4 4 应用实例(续)应用实例(续)25上页上页 下页下页节节末页末页结束结束例例1313:#include #include “stdio.hstdio.h”main( )main( ) char week79 = Sunday, Monday,Tuesday, char week79 = Sunday, Monday,Tuesday, Wednesday,Thursday,Friday, Saturday ; Wednesday,Thursday,Friday, Saturday ; intint i,j,k,a,n; i,j,
33、k,a,n; do do printf(Pleaseprintf(Please input a number:n); input a number:n); scanf(%dscanf(%d, &n);, &n); while(n999); while(n999); i=n/100; i=n/100; j=n/10%10; j=n/10%10; k=n%10; k=n%10; a=(i+j+k)%7; a=(i+j+k)%7; printf(n%dprintf(n%d % %d+%d+%dweek%d%sn,n,i,j,k,a,weekad+%d+%dweek%d%sn,n,i,j,k,a,we
34、eka););4 4 应用实例(续)应用实例(续)26上页上页 下页下页节节末页末页结束结束#include “#include “stdio.hstdio.h” ” #include “ #include “string.hstring.h” void void main ( )main ( ) char str80, c; char str80, c; intint i, j, n; i, j, n; printfprintf (Enter string:); (Enter string:); gets ( gets ( strstr ); ); n = n = strlen(strstr
35、len(str);); for ( i=0, j=n-1; ij; i+, j- ) for ( i=0, j=n-1; ij; i+, j- ) c = c = stristri; stristri = = strjstrj; strjstrj = c; = c; printf(Resultprintf(Result:);:); puts ( puts ( strstr ); );4 4 应用实例应用实例 例例1414 输入一行字符串,将其反序后再输出。输入一行字符串,将其反序后再输出。27上页上页 下页下页节节末页末页结束结束 #include “#include “stdio.hstdi
36、o.h” #include “ #include “string.hstring.h” void main ( ) void main ( ) char str180, str280, str80; char str180, str280, str80; intint i, j, n; i, j, n; printfprintf (Enter string1:); gets ( str1 ); (Enter string1:); gets ( str1 ); printfprintf (Enter string2:); gets ( str2); (Enter string2:); gets
37、( str2); n = 0; n = 0; for ( i=0,j=0; str1i!= for ( i=0,j=0; str1i!=00 & str2j!= & str2j!=00; ); ) if ( str1i str2j ) if ( str1i str2j ) strnstrn+ = str1i+;+ = str1i+; else else strnstrn+ = str2j+;+ = str2j+; while ( str1i!= while ( str1i!=00 ) ) strnstrn+ = str1i+;+ = str1i+; while ( str2j!= while
38、( str2j!=00 ) ) strnstrn+ = str2j+;+ = str2j+; strnstrn=00; ; printf(Resultprintf(Result:); puts ( :); puts ( strstr ); );4 4 应用实例应用实例 例例15 输入两个已经按从小到大顺序排列好的字符串,编写输入两个已经按从小到大顺序排列好的字符串,编写一个合并两个字符串的函数,使合并后的字符串,仍然是从小一个合并两个字符串的函数,使合并后的字符串,仍然是从小到大排列。到大排列。28上页上页 下页下页节节末页末页结束结束 # #include include # #includ
39、e include void main ( )void main ( ) intint lengthlength; ; char line100;char line100;gets(line);gets(line);lengthlength=0;=0;whilewhile ( linelength != ( linelength != 00 ) ) lengthlength +; +;printfprintf ( (”String length=%String length=%dndn”, , length);length);l例例16 16 求字符串的长度求字符串的长度根据字符串中根据字符串中 00 的位置来计算字符串长度。的位置来计算字符串长度。若:数组中第若:数组中第 i i 个元素为个元素为00,则,串长,则,串长= = i i。a b c d ef g 0串长串长length=7length=0length=1length=24 4 应用实例应用实例29