二维数组字符数组
1.3 二维数组与多维数组
1.3.1 二维数组一般形式:
类型说明符 数组名 [常量表达式1][常量表达式2] 【例】float a[3][4],b[5][10] 注意:千万不要写成 a[3,4]
1.3.2 二维数组初始化:
1)分行给二维数组初始化
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}
2)一一对应赋值
int a[3][4]={ 1,2,3,4, 5,6,7,8, 9,10,11,12}
3)对部分元素赋值
int a[3][4]={{1},{5},{9}};„„对矩阵的第一列赋值,每行第一个值为1,5,9,其余为0
1 0 0 0
5 0 0 0
9 0 0 0
int a[3][4]={{1},{0,6},{0,0,11}};
1 0 0 0
0 6 0 0
0 0 11 0
int a[3][4]={{1},{5,6}};„„第三行不赋值
1 0 0 0
5 6 0 0
0 0 0 0
int a[3][4]={{1},{},{9}};„„第二行不赋值
1 0 0 0
0 0 0 0
9 0 0 0
4)如果对所有元素都赋值,第一维可以省略,第二维必须有 【例】
int a[3][4]={ 1,2,3,4, 5,6,7,8, 9,10,11,12}
也可以写成:int a[][4]={ 1,2,3,4, 5,6,7,8, 9,10,11,12}
数组初始化的快捷方法——memset函数(内存中连续空间的初始化) int a[10];
for (i = 0; i < 10; i++) a[i] = 0;
和
#include
memset(a, 0, sizeof(a));
如定义一个二维数组int a[25][25];如何用memset对其初始化为0; memset( a, 0, sizeof( a ) );
1.3.3 二维数组应用举例
【例】将一个二维数组行列互换,存到另外一个二维数组中 如
1 2 3
a=
4 5 6
1 4
b= 2 5
3,6
main()
{
int a[2][3]={{1,2,3},{4,5,6}}; int b[3][2],i,j;
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”);
}
for(i=0;i<=2;i++)
{
for(j=0;j<=1;j++) printf(“%5d”,b[i][j]);
printf(“\n”);
}
}
【例】有一个3×4矩阵a[3][4]={{1,2,3,4},{9,8,7,6},{-10,10,-5,2}},编程求出值最
大的元素及其所在的行号、列号
main()
{
int i,j,raw,colum,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];raw=i;colum=j;}
printf(“%d,%d,%d”, a[i][j],raw,colum);
}
【二维、多维数组训练】
1.求一个3*3矩阵两条对角线之和
2.利用二维数组打印杨辉三角(10行)
8 1 6
3 5 7
4 9 2 2要求打印出1到n的自然数构成的魔方阵
3.找出一个二维数组的鞍点。即该位置上的数在该行上最大,在该列上最小。也可能没有鞍
点。
1.4 字符数组
1.4.1 字符数组的一般形式:
char c[10]
1.4.2 字符数组的初始化
1)逐个字符赋值给数组元素
【例】char c[10]={„i?,? ?,?a?,?m?,? ?,?h?,?a?,?p?,?p?,?y?}; 2)若字符个数大于数组长度,按语法错误处理;若字符个数小于数组长度,将这些字符赋值
给前面那些元素,其余元素为空(即‘\0’,ASCII码 0表示空操作)
3)如果数组长度与字符个数相同,数组长度可以省略(不用人工数)
【例】char c[]={„i?,? ?,?a?,?m?,? ?,?h?,?a?,?p?,?p?,?y?}; 4)可以定义二维字符数组
char diamond[5][5]={{„ „,? „,?*?},{„ „,?*?,? „,?*?},{„*?,? „,? „,? „, „*?},{„ „,?*?,? „,?*?},{„ „,? „,?*?}}
钻石图形
1.4.3 字符数组的应用
【例】输出一个字符串
main()
{
char c[10]={ „i?,? ?,?a?,?m?,? ?,?h?,?a?,?p?,?p?,?y?}; int i;
for(i=0;i<10;i++) printf(“%c”,c[i]); printf(“\n”);
}
【例】输出钻石图形
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”);}
}
1.4.4 字符串和字符串结束标志
, C语言中,将字符串作为字符数组来处理 , 字符串结束标志?\0?,例如“C program”9个字符,内存中占10个字节,最后一个字节?\0?
是系统自动加上的
, ※补充字符数组初始化方法
char c[]={“I am happy”}; 也可以写成 char c[]= “I am happy”;
1.4.5 字符数组的输入输出
1)使用循环逐个字符输出。用格式控制符‘%c‘ 2)将整个字符串一次输出。用格式控制符‘%s‘ 【例】
char c[]={”China”;}
printf(“%s”,c); 输出5个字符
char c[10]={”China”;}
printf(“%s”,c); 仍然输出5个字符
3)整个字符串输入(读入),不需要加地址符 & 【例】
char s1[5], s2[5], s3[5]; scanf(“%s%s%s”,s1,s2,s3);
输入数据 how are you?
三个数组状态见下表
h o w \0 \0
a r e \0 \0
y o u ? \0
【例】
上题若改为
char s[13];
scanf(“%s”,s);
输入数据 how are you?
三个数组状态见下表
h o w \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
解释:实际上并不是把12个字符加上\0送到字符数组s中,只将空格前的how送到s中。
1.4.6 字符串处理函数
1.4.6.1 puts(字符数组)将以‘\0‘结束的字符序列(字符串),输出到终端。
加入已定义str是一个字符数组名,且该数组已经被初始化为“China”则执行
puts(str);
结果是终端上输出China
puts 可以包含转义字符
【例】
char str[]={“China\nBeijing”};
puts(str);
输出
China
Beijing
1.6.2 gets(字符数组)
将从键盘输入的字符串赋给字符数组,其函数值是字符数组的起始地址。 注意:puts gets函数无需格式控制符,但是每次只能读入、输出一个字符串。
1.6.3 strcat(字符数组1,字符数组2)
字符串连接函数:将“字符数组2”连接到“字符数组1”的后面。
说明:
1.“字符数组1”要足够长(容纳下“字符数组2”)
2.连接前两个字符串后面都有一个‘\0’,连接时,将“字符数组1”后面的‘\0’去掉,只保留“字符数组2”后面的‘\0’.
例
char str1[30]={“People?s Republic of”};
char str2[]={“China”};
printf(“%s”,strcat(str1,str2)
1.6.4 strcpy(字符数组1,字符数组2)
字符串复制函数:将“字符数组2”复制到“字符数组1”中
说明:
1.“字符数组1”要足够长(容纳下“字符数组2”)
2. “字符数组1”必须写成数组名形式,“字符数组2”可以是数组名,也可以是字符串。 例如:strcpy(str1,str2) strcpy(str,”China”) 都可以
3.复制的同时连字符串后面的‘\0’一起复制
4.字符串之间不能赋值,只能strcpy,下列写法都是错误的~
str1={“China”} str1=str2
5.可以部分复制。
strcpy(str1,str2,2) 将字符数组str2中前两个字符复制到str1中,然后加上字符数组结束符‘\0’
1.6.5 strcmp(字符数组1,字符数组2)
字符数数组比较函数:对两个字符串自左向右逐个字符进行比较(按ASCII码大小比
较),直到出现不同字符或者?\0?为止。
说明:
1.两个字符串相等,函数值为 0
2.字符串1>字符串2,函数值为一正整数
3.字符串1<字符串2,函数值为一负整数
4.注意:
if(str1==str2) printf(“yes”) ——错误~
if(strcmp(str1,str2)==0) printf(“yes”) ——正确写法~
1.6.6 strlen(字符数组)
测试字符串长度的函数:函数值为字符串的实际长度,不包括结束符?\0?
char str[10]={“China”};
printf(“%d”,strlen(str));
输出结果为 5
1.6.7 strlwr (字符数组)
将字符串中大写字母转换成小写
1.6.8 strupr (字符数组)
将字符串中小写字母转换成大写
【字符数组训练】
输入一行字符,统计期中有多少个(单词之间用空格分开)