第六章
1.一维数组的定义和引用
- 定义一维数组
int a[10]
表示定义了一个整形数组,数组名为a,此数组有10个整型元素。定义一维数组的一般形式为 ==类型符 数组名[常量表达式]==
-
[注意]
定义数组时,方括号中的常量表达式用来表示元素的个数,即数组长度。
C语言不允许对数组的大小做动态定义,即数组的大小不依赖于程序运行过程中变量的值,以下定义为不合法:
int n; scanf("%d", &n); int a[n];
如果在被调用的函数(不包括主函数)中定义数组,其长度可以是变量或非常量表达式,在调用func函数式形参n从实参得到值。这种情况被称为“可变长数组”,允许在每次调用func函数时,n有不同的值。但是在执行函数时,n的值是不变的,数组长度是固定的。
void func(int n){ int a[2*n]; ... }
如果指定数组为静态(static)存储方式,则不能用“可变长数组”。如
static int a[2*n]; //不合法,a数组指定为static存储方式
- 引用一维数组
引用数组元素的表示形式为 ==数组名[下标]==
a[0] = a[5] + a[7] + a[2*3];
-
[注意]
定义数组时用到的 ==数组名[常量表达式]== 和 引用数组元素时用的 ==数组名[下标]== 形式相同,但含义不同。例如:
int a[10]; //这里的a[10]表示定义数组时指定数组包含10个元素 t = a[6]; //这里的a[6]表示引用a数组中序号为6的元素
- 初始化
在定义数组时对全部数组元素赋予初值。
int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
只给一部分元素赋值,未赋值部分自动设为0
int a[10] = {0, 1, 2, 3, 4}; // 部分赋值
对全部数组元素赋初值时,由于个数已经确定,所以可以不指定数组长度。
int a[] = {0, 1, 2, 3, 4};
2.二维数组的定义和引用
- 定义二维数组
一般形式为 ==类型符 数组名[常量表达式][常量表达式]==;
float a[3][6]; //第一维有3个元素,第二维有6个元素,分别用方括号括起来,即a为3x4(3行4列)的数组;
float a[3,4][5,10]; //不合法,一个方括号不能写两个下标;
-引用二维数组
二维数组的表示形式为 ==数组名[下标][下标]==
a[2][3]; //表示a数组中序号为2的行中序号为3的列的元素,下标应该是单个整型表达式。
-初始化二维数组
分行给二维数组赋初值
int a[3][4] = {{1, 2,3, 4}, {1, 2,3, 4}, {1, 2,3, 4}};
int a[][4] = {{1, 2,3, 4}, {1, 2,3, 4}, {1, 2,3, 4}};//与上式效果相同
所有数据都写在花括号内,按顺序分配
int a[3][4] = {1, 2,3, 4, 1, 2,3, 4, 1, 2,3, 4};
int a[][4] = {1, 2,3, 4, 1, 2,3, 4, 1, 2,3, 4}; //与上式效果相同
对部分赋值
int a[3][4] = {{1}, {1}, {1}};
结果:
1 0 0 0
1 0 0 0
1 0 0 0
int a[3][4] = {{1}, {0, 1}, {0, 0, 1}}; //没有赋值的部分自动为0
结果:
1 0 0 0
0 1 0 0
0 0 1 0
int a[3][4] = {{1}, {}, {0, 0, 1}}; //第二行自动为0
结果:
1 0 0 0
0 0 0 0
0 0 1 0
3.字符数组
- 定义字符数组
用来存放字符数据的数组是字符数组。字符数组中的一个元素存放一个字符。
char c[10]; //类似数值型数组
-初始化
初始化列表,列表中的初值个数不能大于数组长度,少于则自动定义为空字符(即'\0')。
char c[10] = {'I', '', 'a', 'm', '', 'h', 'a', 'p', 'p', 'y'};
char c[10] = {'I', '', 'a', 'm', '', 'h', 'a', 'p', 'p', 'y', '!'}; //不合法,超出数组长度会报错
char c[10] = {'I', '', 'a', 'm', '', 's', 'a', 'd'}; // c[8]=c[9]='\0', 结果:I am sad\0\0
- 引用字符数组
引用一个元素得到一个字符
# include <stdio.h>
int main()
{
char c[11] = {'I', ' ', 'a', 'm', ' ', 'h', 'a', 'p', 'p', 'y', '.'};//注意c[1]、c[4]中的单引号内有空格;
int i;
for(i=0; i<10; i++)
printf("%c", c[i]);
printf("\n");
return 0;
}
运行结果:
I am happy.
- 关于字符串和字符串的结束标志
使用字符串常量对字符数组进行初始化
char c[] = {"I am happy."}; //将单撇号变为双撇号表示字符串
char c[] = "I am happy."; //效果同上
实际工作中,人们关心的往往是字符串的有效长度而不是字符数组的长度。为了测试字符串的实际长度,C语言规定了一个“字符串结束标志”,以字符‘\0’作为结束标志。也就是说在数组中遇到字符‘\0’,表示字符串结束,把它前面的字符组成一个字符串。系统在处理字符串常量存储时会自动加一个‘\0’。
char c[] = {'C', ' ', 'p', 'r', 'o', 'g', 'r', 'a', 'm', '. };
char c[] = {'h', 'a', 'p', 'p', 'y'};
输出:happyram
char c[] = {'C', ' ', 'p', 'r', 'o', 'g', 'r', 'a', 'm', '. };
char c[] = {'h', 'a', 'p', 'p', 'y', '\0'}; //手动加一个‘\0’,新旧字符就不会连在一起
输出:happy
- 字符数组的输入输出
逐个字符输入输出,使用格式符‘%c’;
# include <stdio.h>
int main()
{
char c[11] = {'I', ' ', 'a', 'm', ' ', 'h', 'a', 'p', 'p', 'y', '.'};//注意c[1]、c[4]中的单引号内有空格;
int i;
for(i=0; i<10; i++)
printf("%c", c[i]);
printf("\n");
return 0;
}
运行结果:
I am happy.
将整个字符串一次输入或输出,使用格式符‘%s’;
char c[] = {"China"};
printf("%s",c); //printf函数中的输出项是字符数组名,而不是数组元素名
运行结果:
China
-
[拓展]
可以使用scanf函数输入一个字符串
char c[]; scanf("%s", c); //c必须是已定义的字符数组名; char str1[],str2[],str3[]; scanf("%s%s%s", str1, str2, str3); //输入时应以空格分隔字符串;
scanf函数中的输入项如果是字符数组名,不要再加地址符‘&’,因为C语言中的数组名代表该数组的起始地址
printf("%o",c); //“%o”格式符可根据数组名输出数组的起始地址; printf("%s",c); //按字符数组名c找到其数组起始地址,然后逐个输出其中的字符,直到遇到‘\0’为止;
-字符串处理函数
-
puts函数——输出字符串的函数。
char str[] = "China\nBeijing"; puts(str);//可以包括换行符 运行结果: China Beijing
gets函数——输入字符串的函数
gerts(str);
。
- [puts和gets函数只能输出或输入一个字符串,不能写成puts(str1,str2)]
-
strcat函数——字符串连接函数
strcat(str1, str2)
。char str1[30] = {"People's Republic of"}; char str2[] = {"China."}; printf("%s", strcat(str1, str2)); 运行结果: People's Republic of China.
-
strcpy和strncoy——字符串复制函数
strcpy(str1, str2)
。strcpy将str2复制到str1中去
char str1[10], str2[]="China"; strcpy(str1, str2); 运行结果: China\0\0\0\0\0;
strncpy将str2最前面的n个字符复制到str1中,取代str1中原有的最前面n个字符。
strncpy(str1, str2, n);
-
strcmp函数——字符串比较函数
strcmp(str1, str2);
将两个字符串自左至右逐个字符相比(按ASCII码值大小比较),知道出现不同的字符或遇到‘\0’为止。若出现不同的字符,则以第一对不相同的字符比较结果为准,位置在后面为大。
- str1==str2,返回0;
- str1>str2,返回一个正整数;
- str1<str2,返回一个负整数;
if(strcmp(str1,str2)>0); printf("yes");
-
strlen——测字符串长度的函数,指实际长度,不包括‘\0’。
char str[10] = "China"; printf("%d", strlen(str)); 运行结果: 5
strlwr——转换为小写的函数。
strlwr(str)
strupr——转换为大写的函数。
strupr(str)