初学C语言-二维数组与字符数组

二维数组与字符数组

二维数组
简单地说就是具有两个下标的数组称为二维数组。

  1. 二维数组的定义形式
    存储类型 类型说明符 数组标识符[常量表达式1] [常量表达式2]
    例如:
    static int a[2][3],b[2][3];
    char c[10][10];
    a[2][3]在内存中想当与
0,00,10,2
1,01,11,2

即[2][3]表示为2行3列。
以此类推[10][10]的数组即表示为10行10列,即这样一个二维数组中可以放10*10个元素。
说明:

  • 二维数组元素的行列下标值也是从0开始的(*)
  • 二维数组每一个元素都具有相同的数据类型。
  • 二维数组占有连续的存储空间,各元素按行的顺序排列。
    以此类推 三维数组,例如a[1][2][3]
0,0,00,0,10,0,2
0,1,00,1,10,1,2

即a[1][2][3]表示为:
1倍数行数2列数3(博主自己的理解)即有123个元素。

  1. 二维数组元素的引用
    二维数组元素的引用格式:
    数组名[下标表达式1][下标表达式2]
    说明:
  • 下标表达式可以是整型常量、整型变量及其表达式
  • 对基本数据类型的变量所能进行的各种操作,也都合适于同类型的二维数组元素。
    例如:
static int a[2][3],b[5][5];
char c[10][9];
a[2][2]=123;
b[2][5]=100;
c[8][8]=a[2][2]*2+a[2][1]/2;
c[5][5]='n';
  • 通过“&”运算可以得到二维数组元素的地址
    例如:a[2][2]元素的地址可以表示为&a[2][2]。
  • 从键盘上为二维数组输入值,一般要用双重循环。
    例如:
int i ,j;
int a[3][3];
for(i=0;i<3;i++){
   for(j=0;j<3;j++){
   scanf("%d",&a[i][j]);
   }
}

例1.从键盘上为一个5*5的整型数组赋值,找出其中的最小值和最大值,并显示出来。

#include<stdio.h>
int main(){
	int i,j;
	int a[5][5];
	printf("请为5*5的整型数组赋值\n");
	for(i=0;i<5;i++){
		for(j=0;j<5;j++){
			scanf("%d",&a[i][j]);
		}
	}
    int	max=a[0][0];
    int min=a[0][0];
	for(i=0;i<5;i++){
	for(j=0;j<5;j++){
			if(min>a[i][j])
			
				min=a[i][j];
		
			if(max<a[i][j])
			
				max=a[i][j];
	}    
	}
		
	printf("max=%d,max=%d",min,max);
		
}


  1. 二维数组的初始化
    二维数组的赋值大概有两个方法:
  • 在程序中的开始位置对数组元素赋初值
    用赋值语句格式“数组元素=常数”或者用函数scanf赋值。例如:
//数组元素=常数
int i,j;
int a[5][5];
for(i=0;i<5;i++){
   for(j=0;j<5;j++){
       a[i][j]=9;
   }
}
//scanf函数
int i,j;
int a[5][5];
for(i=0;i<5;i++){
   for(j=0;j<5;j++){
   scanf("%d",&a[i][j]);
   }
}
  • 二维数组元素在定义数组时的初始化
    一般格式为:
    存储类型 类型说明符 数组标识符[常量表达式1][常量表达式2]={常量表达式表}
    例1:
 static int a[2][2]={{1,2},{2,1}};

表示为 a[0][0]=1,a[0][1]=2,a[1][0]=2,a[1][1]=1
例2:

static int a[2][2]={1,2,3,4};

所表达效果和例1基本相同
例1.从键盘上输入5*5的数组,并找到对角线最大值所在的位置

#include<stdio.h>
int main(){
	int i  ,j;
	int a[5][5];
	int max;
		int r=0;
	printf("请输入5*5的数组\n");
	for(i=0;i<5;i++){
		for(j=0;j<5;j++){
			scanf("%d",&a[i][j]);
		}
	}
    	max=a[0][0];
		for(i=0;j<5;i++){
			if(max<a[i][i])
				max=a[i][i];
			      r=i;	
		}
		printf("max=%d位置是%d",max,r);

}

例2.将一个二维数组行列互换,存到另一个数组中
在这里插入图片描述

#include<stdio.h>
int main(){
	int a [3][1];
	int d [1][3];
	int i,j;
	printf("数入初始数值\n");
	for(i=0;i<3;i++){
		for(j=0;j<1;j++){
			scanf("%d",&a[i][j]);
		}
	}
int c,b;
	c=0;
	b=0;
	for(i=0;i<=2;i++){
		for(j=0;j<1;j++){
		d[c][b]=a[i][j];
		 printf("%d \t",d[c][b]);
		b++;
		
	  }
	}
}

字符数组
用来存放字符数据的数组称为字符数组,类型为char,同其他数组一样可以是一维数组也可以为多维数组。
字符数组的定义
一维字符数组格式为:
存储类型 char 数组标识符[常量表达式]
例如:

static char c[10],p[100]

二维字符数组格式如下:
存储类型 char 数组标识符[常量表达式1][常量表达式2]
例如:

char a[1][3];

以此类推
字符串及其结束标志

  1. 字符串
    所谓“字符串”是指若干C语言规定的有效字符序列,包括字母、数字、专用字符、转义字符等。C中规定,字符串是用双引号括起来的字符序列,也称为字符串常数。
    例如:
    “China”,“wc”、“hust”等
    2、字符串结束标志
    例如:用字符数组在屏幕上显示hello word!!
#include<stdio.h>
int main(){
	char a[]={'h','e','l','l','o',' ','w','o','r','d','!','!'};
	int i ;
	for(i=0;i<12;i++){
		printf("%c",a[i]);
	} 
}

其实上述代码可以加以改进更加方便如:

#include<stdio.h>
int main(){
	char a[]={"hello word!!"};
	int i ;
	for(i=0;i<12;i++){
		printf("%c",a[i]);
	} 
}

char a[]={‘h’,‘e’,‘l’,‘l’,‘o’,’ ‘,‘w’,‘o’,‘r’,‘d’,’!’,’!’}等价于char a[]={“hello word!!”}
字符数组的输入/输出

字符数组的输入输出有两个种办法

  1. 按字符逐个输入输出
  2. 按字符串整个输入输出
  • 对字符数组按字符逐个输入输出 例如:
#include<stdio.h>
int main(){
	printf("请输入要输出的字符:");
	char a[20];
	int i;
	for(i=0;i<20;i++){
		scanf("%c",&a[i]);
	}
	for(i=0;i<20;i++){
		printf("%c",a[i]);
	}
	
} 

2.对字符数组整个字符串输入输出
例如:

#include<stdio.h>
int main(){
	char a[20];
	scanf("%s",a);
	printf("%s",a);
}

注意

  • 当逐个输入输出字符时,要用”%c“格式符,还要指明数组元素的下标,如果是字符串数组按照整个字符串输入输出时,格式应为”%s“
  • 由于数组名就是数组的起始地址,因此在scanf函数和printf函数中只需要写出数组名即可,不应该加取地址运算符&。
  • 输出字符串内容中不包括结束标志符”\0“
  • 如果字符数组长度大于字符串实际长度,按整个字符串输出时,”\0“以后的内容不输出。例如:
static char a[10]={"tom\0 good!!"};
printf("%s",a);

则只能输出tom三个字符,而不是10个。

  • 当scanf函数用格式符”%“输入整个字符串,终止输入用空格和回车
    例1.编程使用格式符”%s“来输入字符串,使用格式符”%c“来输出。
#include<stdio.h>
int main(){
	char a[20];
	printf("输入一个字符串:");
	scanf("%s",&a);
	int i=0;
	while(a[i]!='\0'){
		printf("%c",a[i]);
		i++;
	}
}

常用的字符串处理函数

  1. 输出字符串函数puts
    格式为:puts(字符数组名);
    功能:输出一个以”\0“结尾的字符串,在输出时将”\0“转换为”\n“,且输出的字符串中可以包含转义字符。
    例如:
char a[]={"china"};
puts(a);

2.输入字符串函数gets
格式: gets(字符数组名);
功能:将输入的字符串内容存放到指定的字符数组中
例如:

char a[10];
gets(a);

注意

  • 在使用gets和puts函数时只能输入输出一个字符串,不能写成puts(a,g)或者是gets(a,g).
  1. 字符串复制函数strcpy
    格式: strcpy(字符数组名,字符串)
    strcpy(字符数组1,字符数组2)
    功能:将字符串内容复制到字符数组中。
    例如:
char a[10];
char b[]="china";
strcpy(a,"china");
char s[12];
strcpy(b,s);

注意

  • 在使用strcpy函数进行复制时,要使用#include<string.h>。
  • 定义的数组一定要大,不然容易出错。
  1. 字符串比较函数strcmp
    格式为:strcmp(字符串名1,字符串2)
    功能:将两个字符串的对应字符自左向右逐个比较,直到出现不同字符或者遇到/0字符为止。比较结果由函数值带回
    说明:
  • 字符串的对应字符全部相等,且同时遇到“\0”字符时,才认为两个字符串相等,否则以第一个不相同的字符的比较结果作为整个字符串的比较结果。
  • strcmp函数形式如下:
char a[30],b[30];
gets(a);
gets(b);
p=strcmp(a,b);
  • strcmp 函数的返回值p是一个整数,其含义如下:
    p<0 a<b;
    p>0 a>b
    p=0 a=b
  1. 字符串连接函数 strcat
    格式:strcat (字符数组名1,字符数组名2);
    功能:将字符数组2的内容连接到字符数组1的后面,并在最后面加一个“\0”,且将结果存放在字符数组1中。
  • 字符数组1要够大,要容得下2中所有的元素。
  • 在连接前两个字符串后面都有一个“\0”,连续时将字符数组1后面的“\0”去掉,只在新字符串后面保留一个“\0”.
  • 使用strcat函数连接两个字符串时,应该使用#include<string,h>
  • strcat函数的返回值是字符数组1的地址
  1. 测字符串长度函数strlen
    格式:strlen(字符数组);
    strlen(字符串);
  • 函数值为不包含“\0”在内的字符数组中字符串的实际长度。
  • 还可以直接对字符串求长度
    例如:
static char a[12]="china";
printf("%d",strlen(a));
printf("%d",strlen("china");
  • 12
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值