nullnull第 6章 数组第 6章 数组null本章重点
一维数组
二维数组及多维数组
数组作为函数参数
字符数组与字符串6.1 数组的概念数 组6.1 数组的概念一个班学生的学习成绩
一行文字
一个矩阵
这些数据的特点是:
1.数据量较大,数据不止一个
2.具有相同的数据类型
3.使用过程中需要保留原始数据 C语言为这些数据,提供了一种构造数据类型:数组。所谓数组就是一组具有相同数据类型的数据的有序集合。 数组 数组是由一定数目的同类元素顺序排列而成的结构类型数据;
一个数组在内存占有一片连续的存储区域;
数组名存储数组空间的首地址;
数组的每个元素用下标变量标识. 数组6.1怎样定义和引用一维数组6.1怎样定义和引用一维数组6.1.1 怎样定义一维数组
6.1.2 怎样引用一维数组元素
6.1.3 一维数组的初始化
6.1.4 一维数组程序举例6.1.1 怎样定义一维数组数 组6.1.1 怎样定义一维数组
一维数组是向量
一维数组的元素是基本类型(整型、字符型或者浮点型)、结构类型或类类型6.1.1 定义一维数组数 组6.1.1 定义一维数组一般格式:
数据类型 数组名[ 常量表达式 ];整型、字符型和浮点型等符合标识符命名规则整型常量或常变量、符号常量。数组的长度例 int a[6] ;
char str[80];
const int M=30; //定义常变量M
float num[M];null数 组例 int a[6]; 数组中有6个元素,占用一片连续的存储空间
每个元素的类型都是 int ,都占用4个字节
每个元素可以用数组名[下标]表示和访问,例如:a[2]
数组名代表数组中第一个元素的地址,也被称为数组首地址
a[2]地址为 a+2*46.1.2 引用一维数组中的元素数 组6.1.2 引用一维数组中的元素 数组名[表达式] 以下标方式访问数组 数组的地址整型表达式
地址偏移值例 int a[6];
访问第三个元素:a[2]6.1.2 引用一维数组中的元素数 组例: int ary [ 10 ] , i = 3, j = 5 ; ary [ 0 ] = 1010ary [ i ] = 22ary [ j ] = ary [ i ]ary [ 2+j ] = 31312ary [ ary [ i ] ] = ary [ 0 ]10注意:
C 不提供对数组的
下标范围检查
ary[10]=10;//编译不报错
6.1.2 引用一维数组中的元素null数 组6.1.3 一维数组的初始化与普通变量一样,可以在数组定义的同时,对数组元素赋初值例:int a1[ 5 ] = { 1, 3, 5, 7, 9 };
int a2[ 5 ] = { 0 } ;
int a3[ 5 ] = { 1, 2, 3, } ;
int a4[ ] = { 1, 2, 3, 4, 5, 6, 7 } ;
int a5[ 5 ] = { 1, 2, 3, 4, 5, 6, 7 } ; // a3[3],a3[4]自动赋 0,后面的逗号可选// 自动定义数组长度为7 // 错误,初始化数据过多// 第一个元素初始化为0,其他元素使用默认值0// 各元素分别赋初始值null例:
int a[10]={0,1,2,3,4};相当于
int a[10]={0,1,2,3,4,0,0,0,0,0};
int a[10]={0,0,0,0,0,0,0,0,0,0};相当于
int a[10]={0};
若只有int a[10];其元素的值是多少呢?
是:不确定
int a[5]={1,2,3,4,5};可写为
int a[ ]={1,2,3,4,5};
int a5 [ 5 ] = { 1, 2, 3, 4, 5, 6, 7 } ; 错误6.1.4 一维数组程序举例数 组6.1.4 一维数组程序举例 访问数组中的所有元素例 int a[6];访问 a[0]
访问 a[1]
访问 a[2]
访问 a[3]
访问 a[4]
访问 a[5]访问 a[i] , i从0变化到5for ( i=0 ; i<6 ; i++)
访问 a[i];i作为循环控制变量以及下标访问:输出、运算、输入等操作i用作下标变量,值从0变化到最大值null 例6.1 对10个数组元素依次赋值为0,1,2,3,4,5,6,7,8,9,要求按逆序输出。
解
思路:
定义一个长度为10的数组,数组定义为整型int a[10]
要赋的值是从0到9,a[i]=i,可以用循环来赋值
用循环按下标从大到小输出这10个元素null#include
int main()
{ int i,a[10];
for ( i=0; i<=9; i++)
a[i]=i;
for ( i=9; i>=0; i-- )
printf("%d ",a[i]);
printf("\n");
return 0;
}a[0]~a[9]赋值为0~9a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]按逆序输出a[9]~a[0]定义数组for ( i=起始值; i<终值6 ; i++)
访问 a[i];null引例:将上述数组元素的值交换存放
思路
a[0]和a[9]交换
a[1]和a[8]交换
……a[i]和a[9-i]交换
for(i=0;i<=9;i++)
{ t=a[i];
a[i]=a[9-i];
a[9-i]=t;
}9
8
7
6
5
4
3
2
1
0null 例6.2 用数组处理求Fibonacci数列问题
解题思路:
例5.8中用简单变量处理的,缺点不能在内存中保存这些数。假如想直接输出数列中第25个数,是很困难的。
如果用数组处理,每一个数组元素代表数列中的一个数,依次求出各数并存放在相应的数组元素中
Fibonacci 数列:1,1,2,3,5,8,13,21,34,……
f[0] = 1
f[1] = 1
f[i] = f[i-1] + f[i-2] ( i >= 2 ) (抽象的)null#include
int main()
{ int i; int f[20]={1,1};
for(i=2;i<20;i++)
f[i]=f[i-2]+f[i-1];
for(i=0;i<20;i++)
{ if(i%5==0) printf(“\n”);
printf(“%12d”,f[i]);
}
printf("\n");
return 0;
}例2:将一个整数插入到一有序的整数系列中使之仍然有序例2:将一个整数插入到一有序的整数系列中使之仍然有序分析:
10987null#include
void main( )
{
int a[11], t;
int i;
for ( i=0;i<10;i++)
{ a[i] = i*3; printf("%d ",a[i]);}
printf("\n");
printf("请输入一个整数:" );
scanf("%d",&t);
for( i=9;i>0;i--)
if ( t <= a[i] )
a[i+1]=a[i];
else
break;
a[++i]=t;
for( i=0;i<11;i++)
printf("%d ",a[i]);
printf("\n");
}// 为数组中的元素赋值并输出
0 3 6 9 12 15 18 21 . // 输入待插入的数据 // 将t写入 // 从后往前查找插入位置,并且移动数据 // 输出数组中的元素 练习练习 若要求定义具有10个int型元素的一维数组a,则以下定义语句中错误的是( )。
A)#define N 10 B)#define n 5
int a[N]; int a[2*n];
C)int a[5+5]; D)int n=10,a[n];
若有定义语句:int m[ ]={5,4,3,2,1},i=4;
则下面对m数组元素的引用中错误的是( )。
A)m[--i] B)m[2*2] C) m[m[0]] D)m[m[i]]
练习练习 有以下程序 #include main() { int s[12]={1,2,3,4,4,3,2,1,1,1,2,3},c[5]={0},i; for(i=0;i<12;i++) c[s[i]]++; for(i=1;i<5;i++) printf(“%d”,c[i]); printf(“\n”); } 程序的运行结果是( )。 A)1 2 3 4 B)2 3 4 4
C)4 3 3 2 D)1 1 2 3 null 例6.3 有10个地区的面积,要求对它们按由小到大的顺序排列。(冒泡排序)
解题思路:
排序的规律有两种:一种是“升序”,从小到大;另一种是“降序”,从大到小
把题目抽象为:“对n个数按升序排序”
采用起泡法排序null回顾: 用起(冒)泡法对10个数按从小到大( 升序)排序排序过程:
(1)比较第一个数与第二个数,若为逆序a[0]>a[1],则交换;然后比较第二个数与第三个数;依次类推,直至第n-1个数和第n个数比较为止——第一趟冒泡排序,结果最大的数被安置在最后一个元素位置上
(2)对前n-1个数进行第二趟冒泡排序,结果使次大的数被安置在第n-1个元素位置
(3)重复上述过程,共经过n-1趟冒泡排序后,排序结束null—— 采用相邻元素比较的方法a[i]a[i+1]if (a[i] > a[i+1] ) 38499776139727975297分析:用起(冒)泡法对8个数按从小到大( 升序)排序第一趟起泡过程,7次比较for(i=1;i<8-1;i++)
if(a[i]>a[i+1])
{
t=a[i];
a[i]=a[i+1];
a[i+1]=t;}
}null—— 采用相邻元素比较的方法76137627分析:用起(冒)泡法对8个数按从小到大( 升序)排序第二趟起泡过程,6次比较7652a[i]a[i+1]if (a[i] > a[i+1] ) for(i=1;i<8-2;i++)
if(a[i]>a[i+1])
{
t=a[i];
a[i]=a[i+1];
a[i+1]=t;}
}null9
8
5
4
2
08
9
5
4
2
08
5
9
4
2
08
5
4
9
2
08
5
4
2
9
08
5
4
2
0
9大数沉淀,小数起泡a[0]
a[1]
a[2]
a[3]
a[4]
a[5]for(i=0;i<5;i++)
if (a[i]>a[i+1])
{ t=a[i];a[i]=a[i+1];a[i+1]=t; }null8
5
4
2
0
95
8
4
2
0
95
4
8
2
0
95
4
2
8
0
95
4
2
0
8
9a[0]
a[1]
a[2]
a[3]
a[4]
a[5]for(i=0;i<4;i++)
if (a[i]>a[i+1])
{ t=a[i];a[i]=a[i+1];a[i+1]=t; }null5
4
2
0
8
94
5
2
0
8
94
2
5
0
8
94
2
0
5
8
9a[0]
a[1]
a[2]
a[3]
a[4]
a[5]for(i=0;i<3;i++)
if (a[i]>a[i+1])
{ t=a[i];a[i]=a[i+1];a[i+1]=t; }null4
2
0
5
8
92
4
0
5
8
92
0
4
5
8
9a[0]
a[1]
a[2]
a[3]
a[4]
a[5]for(i=0;i<2;i++)
if (a[i]>a[i+1])
{ t=a[i];a[i]=a[i+1];a[i+1]=t; }null2
0
4
5
8
90
2
4
5
8
9a[0]
a[1]
a[2]
a[3]
a[4]
a[5]for(i=0;i<1;i++)
if (a[i]>a[i+1])
{ t=a[i];a[i]=a[i+1];a[i+1]=t; }nullfor(i=0;i<5;i++)
if (a[i]>a[i+1])
{ ……}for(i=0;i<4;i++)
if (a[i]>a[i+1])
{ ……}for(i=0;i<1;i++)
if (a[i]>a[i+1])
{ ……}……for(i=0;i<5-j;i++)
if (a[i]>a[i+1])
{ ……}for(j=0;j<5;j++)nullint a[10]; int i,j,t;
printf("input 10 numbers :\n");
for (i=0;i<10;i++) scanf("%d",&a[i]);
printf("\n");
for(j=0;j<9;j++)
for(i=0;i<9-j;i++)
if (a[i]>a[i+1])
{t=a[i];a[i]=a[i+1];a[i+1]=t;}
printf("the sorted numbers :\n");
for(i=0;i<10;i++) printf("%d ",a[i]);
printf("\n");
null例3 用选择排序法对10个数按从大到小( 降序)排序 选择排序的方法:
(1)扫描整个线性表,从中找出最大的元素,与第一个元素交换;
(2)除第一个元素,对剩下的子表采用相同的方法找出次大的数,与第二个数交换;
(3)重复上述过程;
(4)对于长度为n的线性表,选择排序需要对表扫描n-1遍。
(5)在最坏的情况下,选择排序需要比较n(n-1)/2次null65(下标2)例 用选择排序法对10个数按从大到小( 降序)排序97 (下标3)9749 t = 0 ; //最大数所在的下标保存在t ,初始值为0
for ( j = 1 ; j < = 4 ; j ++ )
if ( a[ j ] > a [ t ] )
t = j ;
if( t!=0 )
交换a[t]和a[0];第一趟选择排序null65(下标2)例 用选择排序法对10个数按从大到小( 降序)排序76 (下标4)7638 t = 1 ; //最大数所在的下标
for ( j = 2 ; j < = 4 ; j ++ )
if ( a[ j ] > a [ t ] )
t = j ;
if( t!=1 )
交换a[t]和a[1];第二趟选择排序null第一趟选择排序
t = 0 ; //最大数所在的下标保存在t ,初始值为0
for ( j = 1 ; j < = 4 ; j ++ )
if ( a[ j ] > a [ t ] )
t = j ;
if( t!=0 )
交换a[t]和a[0];第二趟选择排序
t = 1 ; //最大数所在的下标
for ( j = 2 ; j < = 4 ; j ++ )
if ( a[ j ] > a [ t ] )
t = j ;
if( t!=1 )
交换a[t]和a[1];……一共要做n-1次// n = 4for ( i=0 ; i a [ t ] )
t = j ;
if( t!=i )
交换a[t]和a[i];
}null#include
#include
#include
void main()
{
int a [10],i ;
srand ( time ( 0 ) ) ; //调用种子函数
for ( i = 0 ; i < 10 ; i ++ )
a[i] = rand() % 100 ; //用随机函数初始化数组
for ( i = 0 ; i < 10 ; i ++ )
printf(“%d ”, a[ i ]); //输出原始随机数序列
cout << endl ;
//接下来是排序种子函数。要求一个无符号整型参数置随机数生成器的启动值。为使种子值可变,用系统时间做srand函数的参数。
时间函数,在time.h定义,用0作参数时,返回系统当前时间 。随机函数。返回0~32767的随机值,该函数没有参数。例 用选择排序法对10个数按从大到小( 降序)排序nullrand()%100结果是随机数除以100后所得的余数,即限定随机的范围是在0~99之间; 使用rand()函数需添加头文件:#include 1. rand()函数
功能:是一个可以生成随机数的函数随机数函数返回的随机数在0~RAND_MAX(32767)之间;2. srand()函数
功能:用来设置随机数的种子,一般与rand()结合使用。否则直接用rand()的话,每次运行程序的产生的随机数都相同。补充知识:null选择排序//选择排序
int max , t ;
for ( i = 0 ; i < 10; i ++ )
{
t = i ;
for ( int j = i + 1 ; j < 10 ; j ++ ) //寻找最大元素
if ( a[j] > a[t] )
t = j ;
if ( t != i )
{
max = a[i] ; //交换数组元素
a[i] = a[t] ;
a[t] = max ;
}
}
//输出排序的结果
for ( i = 0 ; i < 10 ; i ++ )
printf(“%d ”,a[ i ]) ;
cout << endl ;
}例 用选择排序法对10个数按从大到小( 降序)排序交换a[t]和a[i]例4:随机输入十个整数,使之有序输出(插入排序)例4:随机输入十个整数,使之有序输出(插入排序)分析:
i=3tnull分析:
i=3t0null分析:
i=3t0null分析:
i=3t0null分析:
i=3t010插入排序算法null#include
int main( )
{
int a[10],t;
int i,j;
printf("请输入十个整数:");
for ( i=0;i<10;i++) //数组赋值并打印
{scanf("%d",&a[i]);printf("%d ",a[i]);}
printf("\n");
for (i=1;i<10;i++) //插入排序
{ t=a[i];
for (j=i-1;j>=0;j--)
if (t <= a[j]) a[j+1]=a[j];
else break;
a[j+1]=t;
}
for( i=0;i<10;i++)
printf("%d ",a[i]);
printf("\n");
return 0;
}6.2 怎样定义和引用二维数组6.2.1怎样定义二维数组
6.2.2怎样引用二维数组的元素
6.2.3二维数组的初始化
6.2.4二维数组程序举例6.2 怎样定义和引用二维数组6.2.1 二维数组的定义和引用6.2.1 二维数组的定义和引用具有两个下标的数组称为二维数组
二维数组可以看成是一个表格
二维数组中的每一个元素是类型相同、长度相等的一维数组一维数组6.2.1 定义二维数组6.2.1 定义二维数组一般格式:
数据类型 数组名[ 常量表达式1 ] [ 常量表达式 2] ;整型、字符型和浮点型等符合标识符命名规则整型常量或常变量、符号常量。数组的长度例 int a[ 3 ][ 4 ]; // 二维数组,3 行4列3 4 =12个元素
float b[ 2 ][ 5 ]; // 二维数组,2行5列
int c[ 2 ][ 3 ][ 4 ]; // 多维数组,2 3 4 =24 个元素
int d[3,4]; ()null二维数组存储理解例 int a[3][4];
每行元素a[i]由包含4个元素
的一维数组组成二维数组a是由3行元素组成存储空间内是一个一维数组6.2.2 二维数组元素的引用6.2.2 二维数组元素的引用 数组名 [ 表达式1 ] [ 表达式2 ]
以下标方式访问数组 例 int a[ 3 ][ 4 ];
访问2行1列的元素:a[ 2] [ 1 ]
约定:行列值从0算起null6.2.3 一维数组的初始化与一维数组一样,可以在数组定义的同时,对二维数组中的元素赋初值例:
int i [ 2 ] [ 3 ] = { { 1, 2, 3 }, { 4, 5, 6 } } ; // 数组初始化
int j [ 2 ] [ 3 ] = { 1, 2, 3, 4, 5, 6 } ; // 与 i 数组初始化方式等价
int a [ ] [ 4 ] = { 1, 2, 3, 4, 5, 6,7, 8 } ; //缺省第一维长度
int k [ ] [ 2 ] [ 3 ] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 } ;
// 缺省第一维长度
int p [ ] [ 4 ] = { { 1 }, { 1 }, { 1 } } ;
// 仅对第 0 列元素赋初 值{1,0,0,1,0,0,1,0,0}
int m [ 3 ] [ ] = { 1, 2, 3, 4, 5, 6 } // 错误,不能省略第二维长度null访问二维数组中元素的方法
设有数组 a[m][n];
1.访问某行上的所有元素:
例如:a[0][0], a[0][1], a[0][2]…… a[0][n-1] 或
for(j=0; j<=n-1; j++) 访问a[0][j]
2.访问某列上的所有元素:
例如 : a[0][0], a[1][0], a[2][0]…… a[n-1][0]
for(j=0; j<=m-1; j++) 访问a[j][0]for( i=0 ; i
#include
#include
#include
void main()
{
int a[5][5];
int i,j;
//调用种子函数
srand ( time ( 0 ) ) ;
//用随机函数初始化数组
for ( i = 0 ; i < 5 ; i++)
for ( j = 0; j < 5 ; j++)
a [ i ][ j ] = rand() % 100 ; 例 为二维数组中所有元素提供值并输出//输出原始随机矩阵
for ( i = 0 ; i < 5 ; i++)
{
for ( j = 0; j < 5 ; j++)
cout << setw(5)<< a[i][j] ;
cout << endl ;
}
}null6.2.4 二维数组应用举例例6.4 将二维数组行列元素互换,存到另一个数组中解题思路:
定义两个数组:数组a为2行3列,存放指定的6个数
数组b为3行2列,开始时未赋值
将a数组中的元素a[i][j]存放到b数组中的b[j][i]元素中
用嵌套的for循环完成null#include
int main()
{ int a[2][3]={{1,2,3},{4,5,6}};
int b[3][2],i,j;
printf("array a:\n");
for (i=0;i<=1;i++)
{ for (j=0;j<=2;j++)
{ printf("%5d",a[i][j]);
b[j][i]=a[i][j];
}
printf("\n");
}处理a的一行中各元素处理a中某一列元素输出a的各元素a元素值赋给b相应元素null printf("array b:\n");
for (i=0;i<=2;i++)
{ for(j=0;j<=1;j++)
printf("%5d",b[i][j]);
printf("\n");
}
return 0;
} 输出b的各元素null 例6.5 有一个3×4的矩阵,要求编程序求出其中值最大的那个元素的值,以及其所在的行号和列号。
解题思路:采用“打擂台算法”
先找出任一人站在台上,第2人上去与之比武,胜者留在台上
第3人与台上的人比武,胜者留台上,败者下台
以后每一个人都是与当时留在台上的人比武,直到所有人都上台比为止,最后留在台上的是冠军null 例6.5 有一个3×4的矩阵,要求编程序求出其中值最大的那个元素的值,以及其所在的行号和列号。
解题思路:采用“打擂台算法”
定义二维数组,初始化
先把a[0][0]的值赋给变量max,max用来存放当前已知的最大值
a[0][1]与max比较,如果a[0][1]>max,则表示a[0][1]是已经比过的数据中值最大的,把它的值赋给max,取代了max的原值;接着a[0][2]、a[0][3],扫描完第一行
以后依此处理,扫描第二行,….最后max就是最大的值null第一行求最大值:
如果a[0][1]>max,则max=a[0][1]
如果a[0][2]>max,则max=a[0][2]
如果a[0][3]>max,则max=a[0][3]for( j=1; j<4; j++ )
if( a[0][j] > max ) max = a[ 0 ] [ j ];第二行求最大值:
如果a[1][0]>max,则max=a[1][0]
如果a[1][1]>max,则max=a[1][1]
如果a[2][2]>max,则max=a[1][2]
如果a[3][3]>max,则max=a[1][3]for( j=0; j<4; j++ )
if( a[1][j] > max ) max = a[ 1 ] [ j ];nullfor( j=0; j<4; j++ )
if( a[0][j] > max ) max = a[ 0 ] [ j ];for( j=0; j<4; j++ )
if( a[1][j] > max ) max = a[ 1 ] [ j ];for( j=0; j<4; j++ )
if( a[2][j] > max ) max = a[ 2 ] [ j ];max=a[0][0];
for(i=0;i<3;i++)
for( j=0; j<4; j++ )
if( a[ i ][ j ] > max )
max = a[ i ] [ j ];为了找出重复语句,第一行的第一个元素A[0][0]虽然已经预设为了最大,但是也再比较一次nullnull记行号……
int i,j,row=0,colum=0,max;
int a[3][4]={{1,2,3,4},{9,8,7,6},
{-10,10,-5,2}};
max=a[0][0];
for (i=0;i<=2;i++)
for (j=0;j<=3;j++)
if (a[i][j]>max)
{ max=a[i][j]; row=i; colum=j; }
printf("max=%d\nrow=%d\n
colum=%d\n",max,row,colum);
……记最大值记列号练习练习1.以下错误的定义语句是( )。
A)int x[][3]={{0},{1},{1,2,3}}; B)int x[4][3]={{1,2,3},{1,2,3},{1,2,3},{1,2,3}}; C)int x[4][]={{1,2,3},{1,2,3},{1,2,3},{1,2,3}}; D)int x[][3]={1,2,3,4};
2.若有定义:int a[2][3];,以下选项中对a数组元素正确引用的是 ( )。 A)a[2][!1] B)a[2][3]
C)a[0][3] D)a[1>2][ !1]
练习练习 3.有以下程序 main() {int a[4][4]={{1,4,3,2},{8,6,5,7},{3,7,2,5},{4,8,6,1}};
int i,k,t; for(i=0;i<3;i++) for(k=i+i;k<4;k++)
if(a[i][i]
int main()
{ char c[15]={'I',' ','a','m',' ','a',
' ','s','t','u','d','e','n','t','.'};
int i;
for(i=0;i<15;i++)
printf( "%c", c[i] ) ;
printf("\n");
return 0;
} 6.3.3 怎样引用字符数组中的元素和普通数组中元素的访问一样null#include
int main()
{ char c[]={'I',' ','a','m',' ','a',
' ','s','t','u','d','e','n','t','.'};
int i;
for( i=0; i
int main()
{
char c[20]="I am a student." ;
int i;
for( i = 0 ; c[i]!='\0' ; i++)
printf( "%c",c[i] );
printf( "\n" );
return 0;
} 如果数组中有空白区域,用’\0’可以提前结束程序,不需要访问到空白区域6.3.3怎样引用字符数组中的元素例6.7 输出一个菱形图。
解题思路:
定义一个字符型的二维数组,用“初始化列表”进行初始化
用嵌套的for循环输出字符数组中的所有元素。6.3.3怎样引用字符数组中的元素null#include
int main()
{ char diamond[][5]={{' ',' ','*'},
{' ','*',' ','*'},{'*',' ',' ',' ','*'},
{' ','*',' ','*'},{' ',' ','*'}};
int i,j;
for (i=0;i<5;i++)
{for (j=0;j<5;j++)
printf("%c",diamond[i][j]);
printf("\n");
}
return 0;
}6.3.4字符串和字符串结束标志在C语言中,是将字符串作为字符数组来处理的
关心的是字符串的有效长度而不是字符数组的长度
为了测定字符串的实际长度,C语言规定了字符串结束标志’\0’6.3.4字符串和字符串结束标志6.3.4字符串和字符串结束标志 ’\0’代表ASCII码为0的字符
从ASCII码表可以查到,ASCII码为0的字符不是一个可以显示的字符,而是一个“空操作符”,即它什么也不做
用它作为字符串结束标志不会产生附加的操作或增加有效字符,只是一个供辨别的标志6.3.4字符串和字符串结束标志6.3.4字符串和字符串结束标志char c[10]={”China”};//定义字符数组
可写成
char c[10]=”China”;
从c[5]开始,元素值均为\0
6.3.4字符串和字符串结束标志nullC语言将字符串作为字符数组来处理。
字符串常量:“CHINA”,在机内被处理成一个无名的字符型一维数组。‘\0’作为字符串的结束标志,它占内存空间,但不计入串长度。有了结束标志‘\0’后,程序往往依据它判断字符串是否结束,而不是根据定义时设定的长度。null#include
int main()
{ char c[ ] = "I am a student." ;
for ( int i = 0 ; c[i] != '\0' ; i ++ )
printf( "%c" , c[i] );
printf( "\n" );
return 0;
}例:用结束标志’\0’控制字符串输出null字符串与字符数组的区别:char a[ ]={‘C’,’H’,’I’,’N’,’A’};char c[ ]=“CHINA”; 字符数组字符串串尾结束标记null可以用字符串的形式为字符数组赋初值char c[ ]={“I am a boy”}; /*长度11,以‘\0’结尾 */char a[ ]={‘I’, ‘ ’, ‘a’, ‘m’, ‘ ’, ‘a’, ‘ ’ , ‘b’, ‘o’, ‘y’};
/* 长度10字节 */如果数组定义的长度大于字符串的长度,后面均为‘\0’。char c[10]=“CHINA”; ‘\0’的ASCII为0,而‘ ’(空格)的ASCII为32。nullchar w[ ]={‘T’, ‘u’, ‘r’, ‘b’, ‘o’, ‘\0’};char w[ ]={“Turbo\0”};char w[ ]=“Turbo\0”;char w[ ]=‘Turbo\0’;非法nullchar a[2][5]={“abcd”, “ABCD”};str为字符数组在内存中存储的地址,一经定义,便成为常量,不可再赋值。char str[12]=“The String”;非法,在语句中赋值定义数组,开辟空间时赋初值null利用字符串结束标记处理字符数组char c[10]=“CHINA”; 例:对字符串进行加密,#include
int main()
{ char c[10]="CHINA"; //将字符串存放于数组
int i=0;
while(c[i]!='\0') //加密
{ c[i]=c[i]+4;
i++;
}
for(i=0;i<=10;i++) //输出字符串
if(c[i]!='\0')
printf("%c",c[i]);
else break;
printf("\n");
return 0;
}更适合对字符串的处理访问字符串的程序段:
while(c[i]!='\0')
访问 c[i]; 6.3.5 字符数组的输入输出字符数组的输入输出可以有两种方法:
逐个字符输入输出(%c)
整个字符串一次输入输出(%s)
输出的字符中不包括结束符’\0’
用%s输出字符串时,printf函数中的输出项是字符数组名,不是数组元素名
如果一个字符数组中包含多个’\0’,则遇第一个’\0’时输出就结束
6.3.5 字符数组的输入输出6.3.5 字符数组的输入输出可以用scanf函数输入一个字符串
scanf函数中的输入项是已定义的字符数组名,输入时字符串应短于已定义的字符数组的长度6.3.5 字符数组的输入输出6.3.5 字符数组的输入输出char c[6];
scanf(”%s”,c); China↙
系统自动在China后面加一个’\0’
若超过6个字符会怎样?
char c[6];
scanf(”%s”,c); Chinese↙
printf(”%s”,c); Chinese
6.3.5 字符数组的输入输出6.3.5 字符数组的输入输出char str1[5],str2[5],str3[5];
scanf(”%s%s%s”,str1,str2,str3);
How are you? ↙
多个字符串同时输入,以空格作为间隔6.3.5 字符数组的输入输出str1str2str3null#include
int main()
{ char c[10];
scanf("%s",c); //整体输入
printf("%s\n",c); //整体输出
return 0;
}对字符数组进行整体输入和输出nullchar c[15]="I am a student";
① for(i=0;i<15;i++)
printf("%c",c[i]);
② for(i=0;i总结对字符数组的几种输出方法6.3.6 善于使用字符串处理函数在C函数库中提供了一些用来专门处理字符串的函数,使用方便
使用字符串函数时,在程序开头用#include