《C语言程序设计基础课件.pptx》由会员分享,可在线阅读,更多相关《C语言程序设计基础课件.pptx(52页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、共 53 页 第 1 1 页本章要点本章要点1.1.建立数组的概念;建立数组的概念;2.2.掌握一维数组和二维数组的定义、掌握一维数组和二维数组的定义、引用、引用、存储结构和初始化方法;存储结构和初始化方法;3.3.掌握一维字符数组的输入输出;掌握一维字符数组的输入输出;4.4.掌握字符串处理函数的使用;掌握字符串处理函数的使用;5.5.掌握用数组进行编程的技术。掌握用数组进行编程的技术。共 53 页 第 2 2 页7.1 7.1 数组的概念数组的概念如何处理一个班学生的学习成绩?如何处理一个班学生的学习成绩?一行文字怎样存储?一行文字怎样存储?一个矩阵怎样存储一个矩阵怎样存储?.问题的提出:
2、问题的提出:一组具有一组具有相同数据类型相同数据类型的数据的的数据的 有序集合有序集合 这些数据的特点这些数据的特点:1.1.具有相同的数据类型具有相同的数据类型 2.2.使用过程中需要保留原始数据使用过程中需要保留原始数据 C C语言为这些数据提供了一种语言为这些数据提供了一种构造数据类型:构造数据类型:数组。数组。共 53 页 第 3 3 页 数组数组是一组有序的、类型相同的数据的集合,是一组有序的、类型相同的数据的集合,这些数据被称为这些数据被称为数组的元素数组的元素。共 53 页 第 4 4 页7.2 7.2 一维数组一维数组7.2.1 7.2.1 一维数组的定义和引用一维数组的定义和
3、引用1.一维数组的定义一维数组的定义 类型说明符类型说明符 数组名数组名 正整型常量表达式正整型常量表达式;说明:说明:l类型说明符:数组的类型。类型说明符:数组的类型。l数组名同变量名命名规则相同。数组名同变量名命名规则相同。l常量表达式指明数组中元素个数,必须大于零。常量表达式指明数组中元素个数,必须大于零。可以是数值常量、符号常量和字符常量。可以是数值常量、符号常量和字符常量。例如:例如:float mark100;float mark100;char str200;char str200;int int aa1010;共 53 页 第 5 5 页其中:其中:markmark、strst
4、r、a a 是数组名。是数组名。方括号内是数组的方括号内是数组的长度长度。下标的个数称为数组的下标的个数称为数组的维数维数,markmark、strstr是是一维数组、一维数组、a a是二维数组。是二维数组。数组的成员称为数组数组的成员称为数组元素元素。数组元素的类型称为该数组的数组元素的类型称为该数组的基类型基类型。数。数组组markmark的基类型是的基类型是floatfloat,数组,数组strstr的基类型是的基类型是charchar。例如:存储学生成绩用实型数组例如:存储学生成绩用实型数组 mark100mark100,存储一行文字用字符数组存储一行文字用字符数组 str200str
5、200,存储一个存储一个4*64*6的矩阵用二维整型数组的矩阵用二维整型数组 a46a46。共 53 页 第 6 6 页说明说明:(1)(1)数组名后是用方括号数组名后是用方括号而不是圆括号而不是圆括号。(2)(2)数组定义中的常量表达式表示数组元素个数。数组定义中的常量表达式表示数组元素个数。必须必须是大于零的是大于零的常量常量。如:如:int a0,d(6);/*错误错误*/int b-8;/*错误错误*/int c2+3;/*正确正确*/(3)(3)语言中不允许对数组的大小作语言中不允许对数组的大小作动态动态定义。定义。数组的说明语句必须在数组的说明语句必须在可执行语句之前可执行语句之前
6、。#define N 5int aN;int n;scanf(“%d”,&n);int an;int n=10,an;共 53 页 第 7 7 页2.一维数组的引用一维数组的引用 C 语言规定,只能引用单个数组元素,不能一次引用整个数组。语言规定,只能引用单个数组元素,不能一次引用整个数组。数组元素的引用形式:数组元素的引用形式:数组名数组名 下标下标 如如a3n下标可以是整型常量、整型变量或整型表达式。下标可以是整型常量、整型变量或整型表达式。如:如:a3=a0+ai+1;n下标的值是数组元素的下标的值是数组元素的序号序号,且从,且从0开始,直到开始,直到n-1.int a10,说明数组说明
7、数组a一共有一共有10个元素,起始值是个元素,起始值是0。数组数组a的的10个元素分别是:个元素分别是:a0、a1、a9。注意区分数组的定义和数组元素的引用。注意区分数组的定义和数组元素的引用。n数组的输入输出应采用循环的方法数组的输入输出应采用循环的方法.int a10;int a10;for(i=0;i10;i+)for(i=0;i10;i+)scanf(”%scanf(”%d d”,&”,&a ai);i);下标指出在数组中第几个元素共 53 页 第 8 8 页数组中的每个元素数组中的每个元素在功能上在功能上等价于一个一般的变量。等价于一个一般的变量。例如:例如:输入输入100100个学
8、生成绩,并求出总成绩。个学生成绩,并求出总成绩。l 引用数组元素的注意事项引用数组元素的注意事项:float m100,sum=0;float m100,sum=0;for(i=0;i100;i+)for(i=0;i100;i+)scanf(scanf(”%f%f”,&,&m mii););sum+=sum+=m mii;数组方式数组方式float x,sum=0;float x,sum=0;for(i=0;i100;i+)for(i=0;i100;i+)scanf(scanf(”%f%f”,&x);,&x);sum+=x;sum+=x;简单变量简单变量 x x sumsum85 m0m1m2
9、m99 sumsum8285637890638585 851488279501482263167950优点:优点:数据重用数据重用 数据有序数据有序共 53 页 第 9 9 页mark0mark1mark2mark3.mark9986.592.077.552.0.94.02000H2004H2008H200CH。218CH引用数组元素时,根据首引用数组元素时,根据首地址和下标,自动计算出地址和下标,自动计算出该元素的实际地址,取出该元素的实际地址,取出该地址的内容进行操作。该地址的内容进行操作。如引用如引用 mark2:(1)计算计算 2000+2*4=2008(2)取出取出2008的内容的内
10、容l下标与地址的关系下标与地址的关系 为下标运算符为下标运算符,数组数组名、数组元素是两种不同性名、数组元素是两种不同性质的数据。质的数据。数组名是数组的首地址,数组名是数组的首地址,是一个地址常量。是一个地址常量。数组元素则是数值。数组元素则是数值。共 53 页 第 1010 页7.2.27.2.2 一维数组的初始化和输入输出一维数组的初始化和输入输出 在数组定义时为数组元素赋初值称为数组初始化.方法:将初值依次写在花括号方法:将初值依次写在花括号 内。内。如:如:int a5=2,4,6,8,10;存储形式:存储形式:存储单元存储单元共 53 页 第 1111 页(1)给数组中部分元素赋初
11、值,其他元素按零值处理。给数组中部分元素赋初值,其他元素按零值处理。如:如:int a9=1,2;则则 a0=1,a1=2,a2a8值全为值全为0。(2)对数组元素全部赋值可以不指定长度。int a=0,1,2,3,5;int a=0,1,2,3,5;等价于:等价于:int a5=0,1,2,3,5;int a5=0,1,2,3,5;(4)初值的个数不能超过数组总元素的个数)初值的个数不能超过数组总元素的个数。int a3=1,2,3,4;语法错语法错!说明:说明:(3)对数组中间元素赋值必须指明位置)对数组中间元素赋值必须指明位置。int a5=,2,3,4;/*对第对第3-5个元素赋初值个
12、元素赋初值*/共 53 页 第 1212 页数组元素在程序中赋值为个别元素赋值为个别元素赋值main()char as26;as0=a;.利用循环为全部元素赋值利用循环为全部元素赋值main()char as26,ch;for(ch=A;ch=Z;ch+)asch-A=ch;.共 53 页 第 1313 页数组元素的输入输出数组元素输出数组元素输出main()char as26;int i;for(i=0;i26;i+)printf(%c,&asi);.数组元素输入数组元素输入main()char as26;int i;for(i=0;i26;i+)scanf(%c,&asi);.共 53 页
13、 第 1414 页7.2.3 一维数组应用举例 例例1 1 从键盘上输入从键盘上输入1010个实型数存入数组,然个实型数存入数组,然 后按输入顺序的逆序输出这后按输入顺序的逆序输出这1010个数。个数。#include main()float a10;int i;for(i=0;i=0;i-)printf(%10.2f,ai);数组的引用离不开循环。将数组的下标作为循环变量,通过数组的引用离不开循环。将数组的下标作为循环变量,通过循环,就可以对数组的所有元素逐个进行处理。循环,就可以对数组的所有元素逐个进行处理。共 53 页 第 1515 页 例例2 2 从键盘上输入从键盘上输入1010个数,
14、求出其中最大值并输出。个数,求出其中最大值并输出。#include main()int a10,i,max;for(i=0;i10;i+)scanf(%d,&ai);max=a0;for(i=1;imax)max=ai;printf(max=%dn,max);算法分析算法分析:采用打擂台的方法采用打擂台的方法,先把先把10个数存在数组中个数存在数组中,任意指任意指定某数为擂主定某数为擂主,然后擂主依次与其他数比较然后擂主依次与其他数比较,若某数大于擂主若某数大于擂主,则该数为擂主。循环结束,擂主变量中一定是最大的数。则该数为擂主。循环结束,擂主变量中一定是最大的数。指定第指定第1 1个元个元素
15、为擂素为擂主主 共 53 页 第 1616 页 例例33从键盘上输入从键盘上输入6个数存入数组中,再按输入顺序的逆序个数存入数组中,再按输入顺序的逆序存放在该数组中并输出。存放在该数组中并输出。#include main()int a6,i,j,k,t;for(i=0;i6;i+)scanf(%d,&ai);k=6/2-1;for(i=0;i=k;i+)j=6-i-1;t=aj;aj=ai;ai=t;for(i=0;i6;i+)printf(%3d,ai);算法分析算法分析:采用循环设计。逆序操作可总结为:采用循环设计。逆序操作可总结为:ai与与aj进行交换,其中进行交换,其中i=0,1,n/
16、2-1,j=n-i-1程序运行演示程序运行演示3 4 1 5 6 2 a0 a1 a2 a3 a4a5 共 53 页 第 1717 页 例例4 4 利利用用数数组组计计算算斐斐波波那那契契数数列列的的前前2020个个数数,并并以以每每行行5 5个输出。个输出。#include int main()int i,f20=1,1;for(i=2;i20;i+)fi=fi-1+fi-2;for(i=0;i20;i+)if(i%5=0)printf(n);printf(%6d,fi);printf(n);return 0;说明:斐波那契数列的前两说明:斐波那契数列的前两个数是个数是1 1,从第,从第3
17、3个数开始,个数开始,每个数是前两个数之和。即每个数是前两个数之和。即1,1,2,3,5,8,131,1,2,3,5,8,13,满足,满足关系式:关系式:f0=f1=1,fn=f0=f1=1,fn=fn-1+fn-2,2fn-1+fn-2,2 n n 19 19 运行结果:运行结果:共 53 页 第 1818 页例例5 用用冒泡法冒泡法对数据进行由小到大排序。对数据进行由小到大排序。方法:将两个相邻数比较,小的调到前头。采用两重循环。方法:将两个相邻数比较,小的调到前头。采用两重循环。9 8 8 8 8 8 5 5 5 5 4 4 4 2 2 0 8 9 5 5 5 5 8 4 4 4 5 2
18、 2 4 0 25 5 9 4 4 4 4 8 2 2 2 5 0 0 4 4 4 4 4 9 2 2 2 2 8 0 0 0 5 5 5 52 2 2 2 9 0 0 0 0 8 8 8 8 8 8 80 0 0 0 0 9 9 9 9 9 9 9 9 9 9 9由以上可推知:由以上可推知:6 个数要比较个数要比较5趟趟 第第一一趟中要进行两两比较趟中要进行两两比较5次次 第第二二趟中比较趟中比较 4次次 若若 有有n个数,则要进行个数,则要进行n-1趟比较趟比较 第第 i趟比较中要进行趟比较中要进行n-i次两两比较。次两两比较。共 53 页 第 1919 页#include#define
19、N 6 main()int aN,i,j,t;for(i=0;iN;i+)scanf(%d,&ai);for(i=0;iN-1;i+)for(j=1;jaj)t=aj-1;aj-1=aj;aj=t;printf(The sorted numbers:n);for(i=0;iN;i+)printf(%d ,ai);n n个数比较个数比较n-1n-1趟趟第第i i趟比较趟比较n-in-i次次程序运行演示程序运行演示共 53 页 第 2020 页冒泡排序的缺陷:在比较交换的过程中大的数不能冒泡排序的缺陷:在比较交换的过程中大的数不能一次到位,效率低。一次到位,效率低。例例6 6 选择法排序。选择法排
20、序。选择排序法的基本思想:选择排序法的基本思想:以以冒冒泡泡排排序序法法为为基基础础,在在两两两两比比较较后后并并不不马马上上进进行行交交换换,而而是是在在找找到到最最小小的的数数之之后后,记记住住最最小小数数的的位位置置(数数组组中中的的下下标标),待待一一轮轮比比较较完完毕毕后后,再再将将最最小小的的数一次交换到位。数一次交换到位。共 53 页 第 2121 页3 6 1 9 41 6 3 9 41 3 6 9 41 3 4 9 61 3 4 6 9 选择法排序算法选择法排序算法问题问题 将将 3 3、6 6、1 1、9 9、4 4 从小到大排列。从小到大排列。若有若有N N个数,则需要进
21、行个数,则需要进行N-1N-1轮排序处理。轮排序处理。第第1 1轮轮排序从排序从1 1N N个数中找出最小的数,然后将它与第个数中找出最小的数,然后将它与第1 1个个数交换。第数交换。第1 1个数则是最小的数。个数则是最小的数。第第2 2轮轮排序从排序从2 2N N个数中找出最小的数,然后将它与第个数中找出最小的数,然后将它与第2 2个个数交换。第数交换。第2 2个数则是次小的数。个数则是次小的数。经过经过 N-1 N-1 轮处理,完成全部轮处理,完成全部N N个数排序。个数排序。编程时使用编程时使用二重循环二重循环。外外循环控制进行循环控制进行N-1N-1轮排序,轮排序,内内循循环找出环找出
22、第第 i i 轮轮的最的最小小值。值。共 53 页 第 2222 页#include#define N 5main()int aN,i,j,k,t;printf(Input numbers:n);for(i=0;iN;i+)/*输入数组元素输入数组元素*/scanf(%d,&ai);for(i=0;iN-1;i+)/*排序排序*/k=i;for(j=i+1;jaj)k=j;if(k!=i)t=ai;ai=ak;ak=t;printf(The sorted numbers:n);for(i=0;iN;i+)/*输出数组元素输出数组元素*/printf(%d,ai);程序运行演示程序运行演示共 5
23、3 页 第 2323 页 定义二维数组的一般方式:定义二维数组的一般方式:类型说明符类型说明符 数组名数组名 常量表达式常量表达式11常量表达式常量表达式22;例如例如 int a33 存储形式:存储形式:二维数组在内存中二维数组在内存中按行的顺序存放按行的顺序存放,即先存放,即先存放第一行的元素,再存放第二行的元素。第一行的元素,再存放第二行的元素。例如例如 float a34;float a34;7.3 7.3 二维数组二维数组7.3.1 二维数组的定义二维数组的定义第一个下标可第一个下标可能取值的个数能取值的个数第二个下标可第二个下标可能取值的个数能取值的个数共 53 页 第 2424
24、页说明:说明:二维数组除了维数比一维数组多一维外,二维数组除了维数比一维数组多一维外,其它性质与一维数组全部类似。其它性质与一维数组全部类似。下面写法是否正确?下面写法是否正确?int a03;用于定义数组长度的常量表达式的值必须用于定义数组长度的常量表达式的值必须是大于是大于0的正整数。的正整数。int i=3,j=4;int aij;定义数组元素的个数必须使用常量表达式,定义数组元素的个数必须使用常量表达式,而不能使用变量。而不能使用变量。共 53 页 第 2525 页7.3.2 二维数组的引用二维数组的引用 二维数组的引用二维数组的引用与引用一维数组元素一样,也用与引用一维数组元素一样,
25、也用下标法引用二维数组元素。下标法引用二维数组元素。二维数组元素表示形式:二维数组元素表示形式:数组名数组名下标下标1下标下标2 下标下标1和下标和下标2是整型常量、整型变量或整型表达是整型常量、整型变量或整型表达式。其编号是从式。其编号是从0开始的开始的。例如:若有例如:若有 int a2*53*4,i=15;则使用则使用 a3*30,a1i-5都是合法的。都是合法的。说明说明:数组名:数组名a代表的是代表的是数组数组a在内存中的首地址在内存中的首地址,因此,可以用数组名因此,可以用数组名a来代表数组元来代表数组元 素素a00的的地址。地址。数组名是常量,不可对它赋值。数组名是常量,不可对它
26、赋值。下标不要越界下标不要越界下标不要越界下标不要越界共 53 页 第 2626 页一、二维数组的初始化一、二维数组的初始化1.分行给二维数组赋初值。分行给二维数组赋初值。如:int a23=2,3,1,1,2,3;2.2.将所有数据写在一个将所有数据写在一个 内,按顺序赋值。内,按顺序赋值。即按数组元素在内存中排列的顺序赋初值。即按数组元素在内存中排列的顺序赋初值。int a23=2,3,1,1,2,3;int a23=2,3,1,1,2,3;7.3.3 二维数组的初始化和输入输出二维数组的初始化和输入输出共 53 页 第 2727 页3.对部分元素赋值对部分元素赋值如:int a33=1,
27、0,1,0,0,1;相当矩阵:4.如果对数组全部元素赋初值,第一个下标可省略,但第二如果对数组全部元素赋初值,第一个下标可省略,但第二个下标不可省略。个下标不可省略。如:a34=0,1,3,1,2,1,0,2,1,1,2,0;可写成 a 4=0,1,3,1,2,1,0,2,1,1,2,0;int a33=1,0,0,1;相当矩阵:int a23=5,6,7,8;int a23=5,6,7,8;例得到的数组为得到的数组为:5 6 0 7 8 0得到的数组为得到的数组为:5 6 7 8 0 0共 53 页 第 2828 页1.二维数组的输入二维数组的输入 int a23,i,j;for(i=0;i
28、2;i+)for(j=0;j3;j+)scanf(%d,&aij);2.二维数组的输出二维数组的输出 int a23,i,j;for(i=0;i2;i+)for(j=0;j3;j+)printf(%5d,aij);二、二维数组的输入、输出二、二维数组的输入、输出共 53 页 第 2929 页7.3.4 二维数组程序举例二维数组程序举例例例1 将一个矩阵将一个矩阵a 23转置存到另一个矩阵转置存到另一个矩阵b 32中。中。分析:用数组分析:用数组a、b分别代表矩阵分别代表矩阵a、b;a 矩阵的矩阵的行数行数必须要等于必须要等于b 矩阵的矩阵的列数列数。执行:执行:bji=aij;即可完成转换。即
29、可完成转换。涉及到两个下标的,一般用涉及到两个下标的,一般用两重两重循环。循环。求矩阵转置问题也可以在矩阵本身进行,但应求矩阵转置问题也可以在矩阵本身进行,但应是方阵。是方阵。共 53 页 第 3030 页main()int a23=1,2,3,4,5,6;int b32,i,j;printf(“array a:n”);for(i=0;i2;i+)for(j=0;j3;j+)printf(%5d,aij);bji=aij;printf(n);printf(array b:n);for(i=0;i3;i+)for(j=0;j2;j+)printf(%5d,bij);printf(n);运行结果如
30、下:运行结果如下:array a:1 2 3 4 5 6 array b:1 4 2 5 3 6 共 53 页 第 3131 页例例2求方阵求方阵A4*4的转置阵,并将该转置阵输出的转置阵,并将该转置阵输出(限定在一个数组进行限定在一个数组进行)main()int a44,i,j,t;printf(array a:n);for(i=0;i4;i+)for(j=0;j4;j+)scanf(%d,&aij);/*输入输入*/for(i=0;i4-1;i+)/*转置转置*/for(j=i+1;j4;j+)t=aij;aij=aji;aji=t;printf(“rotated a:n);for(i=0
31、;i4;i+)for(j=0;j4;j+)printf(%4d,aij);/*输出输出*/printf(n);程序运行情况:程序运行情况:array a:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 rotated a:15 9 13 26 10 1437 11 154 8 12 16转置部分还可改写如下:转置部分还可改写如下:for(i=1;i4;i+)for(j=0;ji;j+)t=aij;aij=aji;aji=t;二维数组输入二维数组输入共 53 页 第 3232 页程序:main()int i,j,row=0,colum=0,max;int a34=1
32、,2,3,4,9,7,4,6,-1,2,0,8;max=a00;for(i=0;i=2;i+)for(j=0;jmax)max=aij;row=i;colum=j;printf(max=%d,row=%d,colum=%dn,max,row,colum);运行结果为:max=9,row=1,colum=0例例3 求求34矩阵中最大元素的值及其所在行和列号。矩阵中最大元素的值及其所在行和列号。共 53 页 第 3333 页将程序补充完整将程序补充完整:#include stdio.hmain()例例4编写求整型矩阵编写求整型矩阵A3*3的副对角线元素之积的程序。的副对角线元素之积的程序。共 53
33、 页 第 3434 页7.4 7.4 字符数组字符数组7.4.1 7.4.1 一维字符数组的定义一维字符数组的定义 用来存放字符数据的数组是用来存放字符数据的数组是字符数组字符数组。C语言用字语言用字符数组存放符数组存放字符串字符串,字符数组中的,字符数组中的各元素依次各元素依次存放字符存放字符串的串的各字符各字符。格式:格式:char char 数组名数组名 常量表达式常量表达式 强调:字符串强调:字符串实际实际占有单元的数量等于占有单元的数量等于字符串长度字符串长度+1。定义时应注意考虑定义时应注意考虑元素总个数元素总个数应比应比实际长度多实际长度多1。例如例如:char c6,b10;C
34、 数组具有数组具有6个元素,可以存放长度等于或小于个元素,可以存放长度等于或小于5的字符串。的字符串。共 53 页 第 3535 页1.1.用单个字符对字符数组初始化用单个字符对字符数组初始化例如:例如:char char ch6=ch6=C C,H H,I I,N N,A A,00;把把5 5个字符分别赋给个字符分别赋给ch0ch0到到c4.c4.在内存中存放情况:在内存中存放情况:7.4.2 7.4.2 一维字符数组的初始化一维字符数组的初始化说明:说明:(1 1)初值的个数不能超过数组元素的个数,否则语法错)初值的个数不能超过数组元素的个数,否则语法错 (2)(2)初值的个数小于数组长度
35、,系统自动添入结束符初值的个数小于数组长度,系统自动添入结束符00(3)(3)初值的个数与数组元素相等,定义时可省略长度初值的个数与数组元素相等,定义时可省略长度 (4)(4)因字符串常量自动加因字符串常量自动加0,0,因此常人为地在字符数组后加因此常人为地在字符数组后加一个一个00。CHINA0c0 c1 c2 c3 c4 c5串长串长=5=5共 53 页 第 3636 页2.2.用字符串常量对字符数组初始化:用字符串常量对字符数组初始化:char ch6=CHINA;char ch6=CHINA;char ch6=CHINA;char ch6=CHINA;/*/*省略省略 */*/char
36、 ch=CHINA;char ch=CHINA;/*/*省略长度值省略长度值*/char d12=char d12=How are youHow are you与与char d=char d=H H,o o.w w,a a,r r,e e,y y,o o,u u,00;等价等价将字符串存储到字符数组中,字符串和第一个将字符串存储到字符数组中,字符串和第一个00构成有效字符串。对字符串的操作,就是对构成有效字符串。对字符串的操作,就是对字符数组的操作。但是它和普通字符数组的操作不字符数组的操作。但是它和普通字符数组的操作不同。普通数组中的元素是确定的,一般用下标控制同。普通数组中的元素是确定的,
37、一般用下标控制循环;而字符串使用结束符循环;而字符串使用结束符00来控制循环。来控制循环。共 53 页 第 3737 页例如:例如:chara6=chara6=g g,r r,e e,e e,n n,00;char b5=char b5=123123;a2=a2=00;a5=b1;a5=b1;printf(printf(%cn%cn,a1);,a1);printf(printf(%s%s,a);,a);7.4.3 7.4.3 一维一维字符数组的字符数组的引用引用共 53 页 第 3838 页 main()int i;char a3;for(i=0;i3;i+)scanf(%c,&ai);for
38、(i=0;i3;i+)printf(%c,ai);printf(n);输入数据顺序:输入数据顺序:dos输出数据顺序:输出数据顺序:dos 7.4.4 7.4.4 字符数组的字符数组的输入与输出输入与输出1.1.单字符输入输出单字符输入输出(用格式符用格式符c c或字符输入函数或字符输入函数)char a3;for(i=0;i3;i+)ai=getchar();for(i=0;i3;i+)putchar(ai);printf(n);共 53 页 第 3939 页char a7;scanf(%s,a);2.2.字符串整体或部分输入输出字符串整体或部分输入输出(用格式符用格式符s)s)-输入输出项
39、必须是以字符串的地址形式出现;输入输出项必须是以字符串的地址形式出现;也可以是字符串常量:也可以是字符串常量:printf(%sn ,abcd );-只能输入不包括只能输入不包括空格空格、tt和和nn的字符串;的字符串;-若要输入空格,用若要输入空格,用getsgets函数;函数;-数组名前不加数组名前不加&符号符号。如:如:char a10;scanf(%s,a);printf(%sn,a);输入:输入:How are you输出:输出:How空格、跳格和回空格、跳格和回车是输入数据的车是输入数据的结束标志结束标志.共 53 页 第 4040 页n 用用s s输出字符串时,从输出项提供的地址
40、开始输输出字符串时,从输出项提供的地址开始输出,直到遇到字符串结束符出,直到遇到字符串结束符 00 为止为止。n 若字符串长度与数组定义长度相等,则字符串结束若字符串长度与数组定义长度相等,则字符串结束标志无法存储,输出字符串后继续输出后续存储单元标志无法存储,输出字符串后继续输出后续存储单元内容。内容。若若:char b3=xyz,c=H,a10=abcd072;printf(b=%sn,b);printf(c=%cn,c);printf(a=%sn,a);输出:输出:b=xyz c=H a=abcd:共 53 页 第 4141 页#include main()int i=0;char s1
41、80;printf(Input string s1:n);gets(s1);while(s1i!=0)i+;printf(i=%dn,i);例例:求给定字符串的长度。求给定字符串的长度。通常用来通常用来判断字符判断字符串的结束串的结束共 53 页 第 4242 页 strcat strcat 字符串连接字符串连接strcpy strcpy 字符串复制字符串复制strcmp strcmp 字符串比较字符串比较strlen strlen 字符串长度字符串长度strlwr strlwr 将字符串中的大写字符转换为小写字符将字符串中的大写字符转换为小写字符strupr strupr 将字符串中的小写字
42、符转换为大写字符将字符串中的小写字符转换为大写字符(使用时注意程序前边加使用时注意程序前边加:#include):#include)7.4.5 字符串处理函数字符串处理函数C函数库中提供一些用来处理字符串的函数:函数库中提供一些用来处理字符串的函数:puts 输出字符串输出字符串 gets 输入字符串输入字符串 (使用时注意程序前边加使用时注意程序前边加:#include)共 53 页 第 4343 页(1)(1)puts(puts(字符数组字符数组)将一个字符串输出到终端并换行。将一个字符串输出到终端并换行。(2)gets(字符数组字符数组)输入一个字符串到字符数组,该输入一个字符串到字符数
43、组,该字符数组的起始地址为该函数值。字符数组的起始地址为该函数值。可以输入带空格的字符串可以输入带空格的字符串,用用scanf的的%s格式不行格式不行.main()char str=book;puts(str);其作用与其作用与printf(%s,str)等效等效main()char str12;gets(str);puts(str);输入:输入:How are you输出:输出:How are you共 53 页 第 4444 页(3)strcat(字符数组字符数组1,字符数组,字符数组2)连接两个字符串,连接两个字符串,把字符数组把字符数组2连到字符数组连到字符数组1上,该数值为字符数组上
44、,该数值为字符数组1的地址。的地址。如:如:char str140=C language;char str2=program;printf(%s,strcat(str1,str2);输出:输出:C language program(4)strcpy(字符数组字符数组1,字符数组,字符数组2)将字符数组将字符数组2拷贝到字符数组拷贝到字符数组1中去。字符数组中去。字符数组1的长度应大于字的长度应大于字符串符串2的长度。的长度。如:如:char str110,str2=red flag;strcpy(str1,str2);不能用赋值形式不能用赋值形式 str1=str2共 53 页 第 4545
45、页(5)strcmp(字符串字符串1,字符串,字符串2)两个串的比较;两个串的比较;说明:说明:1)确定字符)确定字符串大小的基本规则:串大小的基本规则:按照串中对应位置字符的按照串中对应位置字符的ASCII码值的大小确定大小。码值的大小确定大小。abc b 因为字符因为字符 a abadef 因为字符因为字符 c a2)比较结果由函数值带回(返回两个字符之差)。)比较结果由函数值带回(返回两个字符之差)。例如:例如:if(str1=str2)错误错误 if(strcmp(str1,str2)=0)正确正确共 53 页 第 4646 页(6)strlen(字符数组字符数组)测试字符数组的长度测
46、试字符数组的长度(不包括不包括0”);如:如:char str10=yellow;printf(“%d”,strlen(str);结果:结果:(7)strlwr(字符串字符串)将大写字符串变小写字符串。将大写字符串变小写字符串。(8)strupr(字符串字符串)将小写字符串变大写字符串。将小写字符串变大写字符串。共 53 页 第 4747 页 例例11:输出字符串中的数字字符。请完善程序。:输出字符串中的数字字符。请完善程序。#include stdio.hmain()char a80;int i=0;gets(a);while(ai!=)if()putchar(ai);7.4.6 字符数组应
47、用举例字符数组应用举例共 53 页 第 4848 页#include main()char str120,str220;int i=0;printf(Input a string:);scanf(%s,str1);while(str1i!=0)str2i=str1i;i+;str2i=0;printf%s,str2);程序运行演示程序运行演示 例例2:2:从键盘输入一个字符串,复制到另一个字符数组后显示从键盘输入一个字符串,复制到另一个字符数组后显示 将第一个字符串将第一个字符串字符逐个添加到数字符逐个添加到数组组str2数组中。去掉数组中。去掉第一个串的结束符第一个串的结束符0,添加第二,添
48、加第二个数组的结束符个数组的结束符0。添加结添加结束符束符0输入字输入字符串符串共 53 页 第 4949 页#includestdio.hmain()int nl=0;char c;while(c=getchar()!=EOF)if(c=n)nl+;printf(nl=%dn,nl);程序运行演示程序运行演示判断输入是否结束符例例3:从键盘输入若干行文本,每行以回车结束,以:从键盘输入若干行文本,每行以回车结束,以EOF(ctrl+z)作为输入结束符,统计输入行数。作为输入结束符,统计输入行数。分析:不必存储文本内容,只须定义一个字符变量暂存读入的分析:不必存储文本内容,只须定义一个字符变量
49、暂存读入的字符。用字符。用 getchar()函数读入字符,判断读入的是否回车符,函数读入字符,判断读入的是否回车符,定义一个整型变量计数回车符,以实现统计行数的功能。定义一个整型变量计数回车符,以实现统计行数的功能。共 53 页 第 5050 页#include stdio.hmain()char str150=abcdef,str220=1234567;int i=0,j=0;while(str1i!=0)i+;while(str1i+=str2j+)!=0);puts(str1);puts(str2);程序运行演示程序运行演示 例例44:连接两个字符串。:连接两个字符串。共 53 页 第
50、 5151 页#include stdio.h#include“string.h”main()char str180,min80;int k,len;printf(Input string str1:n);gets(str1);strcpy(min,str1);/*假定第一个字符串是最短字符串假定第一个字符串是最短字符串*/len=strlen(min);/*最短字符串的长度记为最短字符串的长度记为len*/gets(str1);while(str10!=0)/*以空字符串为输入结束标记以空字符串为输入结束标记*/k=strlen(str1);if(klen)len=k;strcpy(min,