




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第十章 字符串与数组,10.1 字符型数据与字符串,10.1.1 字符型常量 在C语言中,用单引号把一个字符括起来就是字符常量。 例如:A、b、+、5,10.1 字符型数据与字符串,说明: 字符常量只能用单引号括起来,不能用双引号括起来 字符常量只能包含一个字符,如abc是非法的 单引号中大写字母和小写字母代表不同的字符常量,如A和a是不同的字符常量,10.1 字符型数据与字符串,字符常量在内存中占一个字节,存放的是字符的ASCII代码值。,ASCII码对照表,10.1 字符型数据与字符串,10.1.2 可对字符常量进行的运算 在C语言中,字符常量可参与任何整数运算 例如: B A 66 65
2、 1 A + 2 65 + 2 67 大小写转换: A + 32 97 a a - 32 65 A 数字字符与整数的转换: 9 0 9 9 + 0 57 9,10.1 字符型数据与字符串,10.1.3 字符型变量 在C语言中,字符型变量用关键字char进行定义 格式: char 字符型变量名 例如: char ch ; ch = A ;,10.1 字符型数据与字符串,说明: 字符型变量在内存中占一个字节,存放字符的ASCII码值,可以参与整型变量所允许的任何运算。,10.1 字符型数据与字符串,例如: char ch ; ch = A ; ch = ch + 32 ; /*大写转小写*/ ch
3、 + ; /*转换成b */,10.1 字符型数据与字符串,10.1.4 字符型数据的输入与输出 1、调用printf和scanf函数输出和输入字符 printf函数使用格式: ch = A ; printf (“ %cn ” , ch ) ;,10.1 字符型数据与字符串,注意: 字符数据可以使用%d格式输出其ASCII码值 ch = A ; printf (“ %dn ” , ch ) ;,10.1 字符型数据与字符串,scanf函数使用格式: scanf ( “ %c ” , 输入项 ) ; 例如: char ch ; scanf ( “ %c ” , ,10.1 字符型数据与字符串,注
4、意:在连续输入多个字符时,字符之间不要输入间隔符(空格、回车、TAB键等)。否则间隔符本身也将作为字符输入。 例如 : char ch1 , ch2 , ch3 ; scanf ( “ %c%c%c ” , 若要输入字符A、B、C,正确输入方法是: ABC /*CR表示回车*/,10.1 字符型数据与字符串,2、调用putchar和getchar函数输出和输入字符 putchar用于输出字符,调用形式如下: char ch ; ch = A ; putchar ( ch ) ; /* 等价于printf(“%c”,ch); */,10.1 字符型数据与字符串,getchar函数用于输入字符,调
5、用形式如下: char ch ; ch = getchar( ) ; /*等价于scanf(“%c”,*/,10.1 字符型数据与字符串,10.1.5 字符串常量 字符串常量是用双引号括起来的一串字符 例如: “ABC”、“1234”、“2009-03-01!”,10.1 字符型数据与字符串,说明: 字符串必须用双引号括起来,字符个数不限 每个字符串的结尾,都由系统自动隐含加入 一个0作为字符串的结束标记 例如: “ABCD” “ABCD0”,10.1 字符型数据与字符串,在C语言中,字符串只有常量形式,没有变量形式,不能通过定义变量来存储字符串。但是前面讲过的数组却可以存储字符串,实现对字符
6、串的编程操作。 例如: “ABCDE” /*一串连续的字符*/ char a 6 ; /*一串连续的存储单元*/,a 0 a 1 a 2 a 3 a 4 a 5 ,显然,数组与字符串的结构相同,完全可以存储字符串,10.2 用一维数组存放字符串,在C语言程序中,一般通过赋初值方式给一维字符数组赋字符串。 例如: char str 6 = “ABCDE” ; 效果如下所示:,str 0 str 1 str 2 str 3 str 4 str 5 ,定义数组时,数组的元素个数应至少比字符串的字符个数多一个,用来存放字符串结束标记0,10.2 用一维数组存放字符串,如果在定义数组时,没有预留0的位置
7、,则系统不认为数组存储了一个字符串。 例如: char str 5 = “ABCDE” ;,str 0 str 1 str 2 str 3 str 4 ,系统认为数组str存放了5个毫不相干的字符,分别是A、B、C、D、E,10.2 用一维数组存放字符串,在赋初值时,可以通过字符串中字符的个数决定数组的大小。 例如: char str = “ABCDE” ; 效果如下所示:,str 0 str 1 str 2 str 3 str 4 str 5 ,10.2 用一维数组存放字符串,给数组赋字符串,只能以赋初值的方式进行,其他直接赋值方式都是不允许的。 例如: char str 6 ; str =
8、 “ABCDE” ; /*这样做是错误的*/,10.2 用一维数组存放字符串,到目前为止,我们虽然可以用一维数组存储字符串,但仍然不能用数组对字符串做整体引用,例如有以下定义: char str1 6 , str2 6 = “ABCDE” ; 若将数组str2存放的字符串复制到str1中,以下的做法是错误的: str1 = str2 ;,10.2 用一维数组存放字符串,正确的做法: char str1 6 , str2 6 = “ABCDE” ; int i ; for ( i = 0 ; i 6 ; i + ) str1 i = str2 i ;,10.3 使指针指向一个字符串,可以定义指针
9、变量,直接指向一个字符串,使用形式如下: char *p = “ABCDE” ; 或者: char *p ; p = “ABCDE” ;,10.3 使指针指向一个字符串,注意:不要以为是把整个字符串赋值给指针变量,而只是把字符串首字符的地址赋值给了指针变量。 char *p = “ABCDE” ;,p,指针变量p仅仅存放了字符A的地址,指向了字符A,p 0 p 1 p 2 p 3 p 4 p 5 ,10.3 使指针指向一个字符串,使用指针指向字符串与使用数组存储字符串的区别: 使用数组存储字符串,数组的存储单元固定,且字符串长度受数组长度限制 例如: char str 6 = “ABCDE”
10、; 效果如下所示:,str 0 str 1 str 2 str 3 str 4 str 5 ,数组str最多存储6个字符,10.3 使指针指向一个字符串,使用指针指向字符串,指针变量仅仅存放了字符串首字符的地址,且指针变量可以移动,所指向的字符串长度也没有限制。 char *p = “ABCDE” ;,p,指针变量p仅仅指向了字符A,且字符串的长度没有限制,p 0 p 1 p 2 p 3 p 4 p 5 ,10.3 使指针指向一个字符串,指针变量可以移动,通过对自身的加减运算,能够指向字符串中的任意字符 例如: char *p = “ABCDE”;,*P,P,执行p+或+p之后,10.3 使指
11、针指向一个字符串,char *p = “ABCDE”; 以下程序段功能等价: for ( i = 0 ; i 5 ; i+ ) printf ( “%c” , p i ) ; while ( *p != 0 ) printf ( “%c” , *p ) ; p+ ; ,示例: main() char *a=I love China!; a=a+7; printf(%S,a); 运行结果如下: China!,而数组名虽然代表地址,但它的值是不能改变的。下面是错的: main() chara=I loveChina!; a=a+7; printf(%s,a); ,习题:,#include main
12、() char*s=ABC; do printf(%d,*s%10);s+; while(*s); 注意:字母A的ASCII码值为65。程序运行后的输出结果是 A)5670 B)656667 C)567 D)ABC,10.3 使指针指向一个字符串,综合实例: char str 6 = “ABCDE” ; char *p = str ;,p,可以通过str i 或p i 的形式引用每个字符,还可以通过p的移动,以*p来引用任何一个字符。,p 0 p 1 p 2 p 3 p 4 p 5 ,str 0 str 1 str 2 str 3 str 4 str 5 ,char str 6 = “ABCD
13、E” ; char *p = str ; 以下程序段功能等价: for ( i = 0 ; i 5 ; i+ ) printf ( “%c” , str i ) ; for ( i = 0 ; i 5 ; i+ ) printf ( “%c” , p i ) ; while ( *p != 0 ) printf ( “%c” , *p ) ; p+ ; ,典型试题:,以下选项中正确的语句组是 A)char s ; s=BOOK!; B)char *s ; s=BOOK!; C)char s10 ; s=BOOK!; D)char *s ; s=BOOK!;,典型试题,设有定义:char *c;
14、,以下选项中能够使字符型指针c正确指向一个字符串的是 A)char str =”string”; c=str; B)scanf(“%s”,c); C)c=getchar(); D)*c=”string”;,10.4 字符串的输入与输出,1、字符串输出 可以使用printf函数输出字符串,使用形式如下: char str 6 = “ABCDE” ; printf ( “%sn” , str ) ; 或者: char *p = “ABCDE” ; printf ( “%sn” , p ) ; %s用于输出以某地址值为起始的字符串,遇0结束,10.4 字符串的输入与输出,注意%s与%c的区别: %s
15、用于输出字符串,%c用于输出单个字符 例如: char str 6 = “ABCDE” ; 以下程序功能等价: printf ( “%s” , str ) ; for ( i = 0 ; i 5 ; i+ ) printf ( “%c” , str i ) ;,char *p = “ABCDE” ; printf ( “%s” , p ) ; 输出结果:ABCDE char str 6 = “ABCDE” ; char *p ; for ( p=str ; p str + 5 ; p + ) printf ( “%sn” , p ) ; 输出结果: ABCDE BCDE CDE DE E,pr
16、intf ( “%c” , *p ) ; 输出结果:A,如果换作: printf ( “%cn” , *p ); 则输出结果为: A B C D E,10.4 字符串的输入与输出,2、字符串输入 可以使用scanf函数输入字符串,使用形式如下: char str 6 ; scanf ( “%s” , str ) ; 输入时,字符个数不得超过数组长度,以回车符结束输入。空格作为分隔符不能被读入。,10.4 字符串的输入与输出,注意:指针变量在尚未指向确定地址空间前,不得作为输入项 例如: char *p ; scanf ( “%s” , p ) ; /*这样做是错误的*/ char str 6
17、; char *p = str ; scanf ( “%s” , p ) ; /*这样做是正确的*/,典型试题,有以下程序: #include main() char a20=”How are you?”,b20; scanf(“%s”,b);printf(“%s %sn”,a,b); 程序运行时从键盘输入:How are you? 则输出结果为 。 答案:how are you? how,示例:输入一个字符串,统计字符串的有效长度。,#include main() char s80; int i=0,num=0; scanf(%s,s); while(si!=0) num+; i+; pri
18、ntf(%s,s); printf(n); printf(num=%dn,num); ,若输入的字符串中包含空格,系统会将其作为两个字符串,字符数组s只接收空格前面的部分。,10.4 字符串的输入与输出,3、gets函数 gets函数用来输入字符串,使用形式如下: char str 6 ; gets ( str ) ; 与scanf ( “%s” , str ) 功能相同,但是允许用户输入空格。,10.4 字符串的输入与输出,4、puts函数 puts函数用来输出字符串,使用形式如下: char str 6 = “ABCDE” ; puts ( str ) ; 与printf ( “%s” ,
19、 str ) 功能相同,10.5 字符串数组,在C语言中,一个一维字符数组可以存放一个字符串,而二维数组是行的集合,每行都可以存放一个字符串,因此二维数组必然可以存放多个字符串,是字符串的集合。,10.5 字符串数组,设有如下定义: char str M N ; 数组str可以存放M个字符串,每个字符串长度为N 例如: char str 3 5 ; 可存放3个字符串,每个字符串最大长度为5(包括0),10.5 字符串数组,可以通过赋初值方式在二维字符数组中存放字符串: char str 3 5 = “ABCD”,“EFGH”,“IJKL”;,第0行,第1行,第2行,第0列,第1列,第2列,第3
20、列,第4列,10.5 字符串数组,还可以通过循环语句由键盘输入字符串到二维数组: char str M N ; for ( i = 0 ; i M ; i+ ) scanf ( “%s” , str i ) ; 或 for ( i = 0 ; i M ; i+ ) gets( str i ) ;,用指针数组指向字符串,可以定义字符型指针数组指向多个字符串 例如: char *str = “ABC”, “DEFG” , “12345” ;,str 0 ,str 1 ,str 2 ,ABC,DEFG,12345,示例:根据输入的月份输出月的英文名。,main() char *month=Janua
21、ry,February,March, April, May,June,July, August, Septermber, October,Noverber, Decermber; int mon; scanf(%d, ,char name59=“gain”,“much”,“stronger”, “point”,“bye”;,char *name5=“gain”,“much”,“stronger”, “point”,“bye”;,二维数组与指针数组区别:,二维数组存储空间固定 字符指针数组相当于可变列长的二维数组,指针数组元素的作用相当于二维数组的行名 但指针数组中元素是指针变量 二维数组的行名
22、是地址常量,10.6 用于字符串处理的函数,C语言没有提供对字符串进行整体操作的运算符,但提供了很多有关串操作的库函数。在使用这些函数时,必须在程序前面用命令行指定包含标准头文件 #include ,10.6 用于字符串处理的函数,1、字符串复制函数strcpy 调用形式如下: strcpy ( s1 , s2 ) 把s2所指字符串的内容复制到s1所指存储空间中,函数返回s1的值。,10.6 用于字符串处理的函数,例如: char str1 6 , str2 6 = “ABCDE” ; strcpy ( str1 , str2 ) ; 将数组str2所存储的字符串复制到数组str1中 注意:s
23、tr1的存储空间必须足够大,10.6 用于字符串处理的函数,如果目的存储空间已经存有数据,复制操作将把已有数据覆盖掉。 例如: char str1 6 = “XYZ” , str2 6 = “ABCDE” ; strcpy ( str1 , str2 ) ; str1中的“XYZ”将被覆盖,典型试题: char *p1 , *p2 , str 50 =“ABCDEFG” ; p1 = “abcd” ; p2 = “efgh” ; strcpy( str + 1 , p2 + 1 ) ; strcpy( str + 3 , p1 + 3 ) ; printf (“%sn” , str ) ; 结
24、果:Afgd,10.6 用于字符串处理的函数,2、字符串连接函数strcat 调用形式如下: strcat ( s1 , s2 ) ; 将s2所指字符串的内容连接到s1所指字符串后面,并自动覆盖s1串末尾的0,函数返回s1所指的地址值。,10.6 用于字符串处理的函数,例如: char str1 10 = “ABC” , str2 4 = “DEF” ; strcat ( str1 , str2 ) ; 执行后,数组str1的内容为“ABCDEF”,典型试题: char *p1=“abc” , *p2=“ABC”, str50 = “xyz”; strcpy( str + 2 , strcat
25、( p1 , p2 ) ) ; printf (“%s” , str ) ; 结果:xyabcABC,10.6 用于字符串处理的函数,3、求字符串长度函数strlen 调用形式如下: strlen ( s ) ; 计算出以s为起始地址的字符串的长度,并作为函数值返回。,10.6 用于字符串处理的函数,例如: strlen ( “ABC” ) ; 结果:3 char str 10 = “ABCDE” ; strlen( str ) ; 结果:5,典型试题: strlen( “t”065xffn” ) 结果:5 strlen( “nab1010de” ) 结果:4,10.6 用于字符串处理的函数,
26、4、字符串比较函数 strcmp 调用形式如下: strcmp ( s1 , s2 ) 比较s1和s2所指字符串的大小。若串s1s2,函数值大于0(正数);若s1=s2,函数值等于0;若s1s2,函数值小于0(负数)。,10.6 用于字符串处理的函数,例如: strcmp ( “A” , “B” ) ; strcmp ( “ABC” , “ADC” ) ; strcmp (“AB” , “ABC” ) ; strcmp ( “ABCDE” , “ADC” ) ;,10.6 用于字符串处理的函数,注意:比较两个字符串的大小,必须利用函数完成,不可使用关系运算符。 如下: “ABC” “ADC”
27、这样做是错误的,10.6 用于字符串处理的函数,5、字符串倒置函数strrev 调用形式如下: strrev ( s ) ; 将s所指字符串内容首尾倒置,10.6 用于字符串处理的函数,例如: char str 6 = “ABCDE” ; strrev ( str ) ; printf ( “%sn” , str ) ; 将数组str中的字符串倒置,结果为“EDCBA”,10-7 程序举例,例10-1 编写函数slength ( char *s ) ,函数返回指针s所指字符串的长度,即相当于库函数strlen的功能。,#include slength ( char *s ) int n = 0
28、 ; while ( *( s + n ) != 0 ) n+ ; return n ; main( ) char str = “ABCDEF” ; int len1 , len2 ; len1 = slength( “” ) ; len2 = slength( str ) ; printf(“%d , %d n” ,len1 , len2 ) ; ,解法二: slength ( char *s ) int n ; for ( n = 0 ; s n !=0 ; n + ) ; return n ; ,10-7 程序举例,例10-2 编写函数 scopy ( char *s , char *t
29、 ) ,将指针t所指的字符串复制到指针s所指的存储空间中。,#include void scopy ( char *s , char *t ) int i ; i = 0 ; while ( ( si = ti ) != 0 ) i + ; main ( ) char str120 , str2 = “ABCDEFGH” ; scopy( str1 , str2 ) ; puts( str1 ) ; ,解法2: void scopy ( char *s , char *t ) while( ( *s = *t ) != 0 ) s+ ; t+ ; while ( ( *s + = *t + )
30、 != 0 ) ;,10-7 程序举例,例3:编写函数,实现两个字符串的连接,相当于库函数strcat的功能。,#include main () char str150 , str220 ; gets(str1); gets(str2); fun(str1,str2); puts(str1); void fun ( char *p1 , char *p2 ) int i , j ; for ( i=0 ; p1 i !=0 ; i+ ) ; for ( j=0 ; p2 j !=0 ; j+ ) p1 i+ = p2 j ; p1 i = 0; ,10.7 程序举例,例4:编写函数,删除一个字
31、符串中所有空格,#include #define N 20 main ( ) char str N ; printf ( “ Enter a string : n” ) ; gets ( str ) ; fun ( str ) ; printf ( “The result : n” ) ; puts ( str ) ; void fun ( char *s ) int i , j = 0 ; for ( i = 0 ; si != 0 ; i+ ) if ( si != ) s j+ = si ; s j = 0 ; ,10.7 程序举例,例5:若输入的字符串中只包含字母和*号,请编写函数,将
32、字符串中前导*号全部删除,中间和后面的*号不删除。 例如,原字符串内容为: “*ABC*DEF*” 处理后结果为: “ABC*DEF*”,#include #include #define N 20 main ( ) char str N ; printf ( “ Enter a string : n” ) ; gets ( str ) ; fun ( str ) ; printf ( “The result : n” ) ; puts ( str ) ; void fun ( char *s ) char *p = s ; while ( *p = * ) p+ ; strcpy ( s ,
33、 p ); ,10.7 程序举例,例6:若输入的字符串中只包含字母和*号,请编写函数,将字符串中尾部*号全部删除,前面和中间的*号不删除。 例如,原字符串内容为: “*ABC*DEF*” 处理后结果为: “*ABC*DEF”,#include #define N 20 main ( ) char str N ; printf ( “ Enter a string : n” ) ; gets ( str ) ; fun ( str ) ; printf ( “The result : n” ) ; puts ( str ) ; void fun ( char *s ) while ( *s !=
34、 0 ) s+ ; s- ; while ( *s = * ) s- ; * ( s+ 1 ) = 0 ; ,10.7 程序举例,例7:编写函数,将字符串中的字母转换成字母序列的下一个字母。若是英文字母z(或Z),则转换成字母a(或A)。 例如,原字符串内容为: “AbCD12fZz” 处理后的结果为: “BcDE12gAa”,#include #define N 20 main ( ) char str N ; printf ( “ Enter a string : n” ) ; gets ( str ) ; fun ( str ) ; printf ( “The result : n” )
35、 ; puts ( str ) ; void fun ( char *s ) int i ; for ( i = 0 ; s i != 0 ; i+ ) if ( s i = z | s i = Z ) s i = s i 25 ; else if ( s i =a ,或者写作 else if ( isalpha ( si ),10.7 程序举例,例8:编写函数,将一个数字字符串转换成一个整数。 例如: “1234” 1234,#include #define N 20 main ( ) char str N ; printf ( “ Enter a num string : n” ) ; gets ( str ) ; printf ( “The result : %dn” , fun ( str ) ) ; int fun ( char *s ) int num = 0 ; while ( *s ! = 0 ) num = num * 10 + *s 0 ; s+ ; return num ; ,10.7 程序举例,例9:编写函数,统计输入的字符串中小写字母a到z各自出现的次数。,#include #define N 20 main ( ) char str N ; int p 26 , i ; printf ( “ Enter a string : n” ) ; gets
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高中英语数据驱动下的跨文化交际能力培养论文
- 初中生心理健康教育课程与学校心理健康教育资源配置优化研究论文
- 花岗岩质量管理制度
- 设计工作室管理制度
- 藏在故宫里的中国史读书记录
- 财政结构与人力流动
- 自动判断闰年
- 山东省东营市广饶县2024-2025学年六年级下学期期中考试数学试题(含部分答案)
- 自动控制升降旗的单片机系统设计
- 自动控制理论课程教学大纲
- 致命性肺血栓栓塞症急救护理专家共识(2024版)解读
- 2025年医药代表职业资格考试试题及答案
- 项目合作经验与能力证明(8篇)
- 2025年广东省深圳中考数学考前冲刺(含详解)
- 2025-2030年中国基因检测行业现状调查及发展前景预测研究报告
- 贵州省黔南布依族苗族自治州2023-2024学年八年级下学期期末质量监测语文试卷(含答案)
- 2025年“全国安全生产月”《安全知识》竞赛题库及答案
- 2025中考政治最后一课及考前指导【课件】
- 2025春国开《马克思主义基本原理》大作业答案
- 中考物理考前指导最后一课
- 23秋国家开放大学《液压气动技术》形考任务1-3参考答案
评论
0/150
提交评论