天天看点

C语言学习之数组

一维数组的定义方式:

数据类型 数组名[整型常量表达式]

注意:方括号中只能是常量表达式,不能使用变量。常量表达式的值表示数组最多能存放的元素的个数,也称为数组的大小

数组所占总字节数=sizeof(数据类型)*数组大小

int k=5;float c[k];  不合法,k是变量

#define M 20 

int num[M];  //合法,M是编译预处理命令define定义的符号常量

&数组名[下标]代表元素在内存中的地址。

ch[2.5+2.5]    //非法,下标只能是整型表达式

ch[10-10]  //合法,相当于ch[0]

一维数组的初始化

变量的初始化就是定义变量的同时赋初值,一维数组初始化有以下几种

(1)char a[5]={'h','e','l','l'};

(2)int a[6]={1,2,3};

(3)int a[]={1,2,3}  //在定义时[]中的值不能为空,只有当用初始值进行初始化时,才可省略,利用初始值的个数作为数组的大小。

二维数组

定义:类型说明符 数组名[整型常量表达式][整型常量表达式];    //int a[3][4];

二维数组的引用  

      类似于一维数组元素的引用方式,二维数组元素的引用方式也是 “数组名[下标]”。其区别是,二维数组是“有行有列”,因此比一维数组多一个下标,即 数组名[下标][下标]

      例如“int a[3][4];定义一个具有3行4列的整型数组a,数组可以存放12个整数。可以将数组a看成是由3个一维数组组成的,每个一维数组中又含有4个元素。这3个一维数组的名称是a[0]、a[1]和 a[2],第一个数组a[0]的各元素为a[O][O]、a[0][1]、 a[0][2]、a[O[3];第二个数组、第三个数组以此类推。数组a各成员变量如下:

      a[0][0],a[0][1], a[0][2], a[0][3]

      a[l][0],   a[1][1],  a[1][2],   a[1][3]

      a[2][0],a[2][1], a[2] [2],  a[2][3]

      在内存中二维数组是否也是这样“有行有列”存放吗?答案是否定的。计算机内存没有什么所谓的“行”与“列”,都是以字节为单位的连续空间。二维数组在内存存放时,采用“逐行存放”,行是“从上到下”,每一行是“从左至右”。例如,上例中的数组a[3][4]在内存存放元素的顺序是: a[O][0]→a[0][1]→a[0][2]- a[0][3]→a[1][0]-._ a[2][2]-a[2][3]。

   二维数组的初始化

二维数组初始化有以下几种方法

(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,2},{5}};

(4)int a[3][4]={1,2,5};

(5)int a[][4]={1,2,3,4,5,6,7,8,9,10,11,12};   //只能省略行数,不能省略列数,原因在于二维数组是按行进行存放的,省略列数就无法控制何时转入下一行。

(6)int a[][4]={1,2,3,4,5,6};

字符串与字符数组

字符串存放内存时,除了将其中的每个字符存入内存外,还要在最后加一个“\0”字符存入内存,“\0”也是字符串结束标志。定义用于存放字符串的字符数组时,数组的大小应该字符串的长度+1。

1、用一维数组存放一个字符串

(1)char a[4]={'a','b','c','d'};//一维字符数组

(2)char a[5]={'a','b','c','d','\0'};   //存放了字符串abcd

(3)char a[5]={"abcd"}    //双引号是字符串常量的标志

(4)char a[5]="abcd"   //与(3)等价

(5)char a[]="abcd" ;  //有初始值来确定数组的大小

(6)char a[]={'a','b','c','d'};

2、用二维数组存放多个字符串

char s[3][10]={"456","ab","M"};  //表示二维数组最多可以存放三个字符串,每个串的长度最大为9,留一个存放‘\0’

字符串的输入输出

1、字符串的输出

字符串的输出可以使用printf()和puts()

1)printf()函数

(1)按%c的格式,利用循环控制语句将字符串中的字符逐个输出到屏幕

#include <stdio.h>
void main()
{
	int i;
	char str[6]={'w','o','r','l','d','\0'};
	for(i=0;i<6;i++)
	printf("%c",str[i]);   //world  
}
           

(2)按%s的格式,用printf()将数组的内容输出到屏幕,直到遇到‘\0’为止。

#include <stdio.h>
void main()
{
	char str1[5]={'w','o','r','l','d'};
	char str2[6]={'w','o','r','l','d','\0'};
	char str3[]="world";
	printf("str1:%s\n",str1);  
	printf("str2:%s\n",str2); 
	printf("str3:%s\n",str3); 
}
           
C语言学习之数组

分析:从程序中可以看出利用printf()函数使用%s格式进行输出字符数组时,输出列表中使用的是“数组名”。输出字符数组str1时,显示的结果中最后出现了一些随机字符,原因在于数组str1初始化时没有结束标志\0,因此输出时会把超出数组范围的内存中随机的字符输出,直到遇到机内的"0'为止,这显然不是我们所期望的。而数组str2和str3在初始化时都是按照字符串的格式进行初始化的,因此输出结果是正常的。

    因此,prinf函数采用%s的格式常用于输出字符串,输出内容处只需书写“数组名”即可,但要注意数组中存放的是否是字符串。

2) puts函数

puts函数也可实现输出字符串,并且自动将字符串的结束标"\0转换成回车换行符。

#include <stdio.h>
void main()
{
	char str1[5]={'w','o','r','l','d'};
	char str2[6]={'w','o','r','l','d','\0'};
	char str3[]="world";
	puts(str1);  
	puts(str2); 
	puts(str3); 
}
           
C语言学习之数组

2、字符串的输入

字符串的输入可以使用scanf和gets函数实现。

1)scanf函数

(1)按%c的格式,利用循环控制语句

#include <stdio.h>
void main()
{
	int i;
	char str[6];
	for(i=0;i<5;i++)
	scanf("%c",&str[i]);
	str[5]='\0';
	puts(str);
}
           

(2)按%s的格式,将猪粉草的内容输入到字符数组,当输入的字符是“空格”“Tab”或回车键,系统默认输入结束。

#include <stdio.h>
void main()
{
	char str1[7];
	char str2[7];
	printf("input str1:");
	scanf("%s",str1);
	printf("input str2:");
	scanf("%s",str2);
	printf("str1:%s\n",str1);
	printf("str2:%s\n",str2);

}
           
C语言学习之数组

2)gets函数

可以实现输入字符串到字符数组中,当遇到回车键时,系统默认用户输入结束

#include <stdio.h>
void main()
{
	char str1[7];
	char str2[7];
	printf("input str1:");
	gets(str1);
	printf("input str2:");
	gets(str2);
	printf("str1:%s\n",str1);
	printf("str2:%s\n",str2);

}  
           
C语言学习之数组

字符串处理函数

使用前要包含对应的头文件string.h

strlen(字符数组)——测字符串长度

功能:计算机指定字符串的实际长度(不含字符串结束\0),并返回字符串的长度。

strcat(字符数组1,字符数组2)

功能:将字符数组2中存放的猪粉草连接到字符数组1中存放的字符串尾部,同时删去字符串1的结束标志\0,组成新的字符串,存入字符数组1中。该函数返回的是字符串1的首地址。

strcmp(字符数组)

功能:安装从左到右的顺序依次比较字符数组1和字符数组2对应位置字符ASCII码值,并返回比较结果,

  • 字符串1=字符串2,返回0
  • 字符串1>字符串2,返回大于0的数
  • 字符串1<字符串2,返回小于0的数

strcpy(字符数组1,字符数组2)

功能:把字符数组2中的字符复制到字符数组1中,结束标志也复制进去。

注意;复制后原有的字符串将被覆盖。

执行下面的程序时,如果输入A,则输出结果是A123

#include <stdio.h>
#include <string.h>
void main()
{
	char ss[10]="1,2,3,4,5";
	gets(ss);
	strcat(ss,"123");
	printf("%s\n",ss);
}