第六章:数组
一、一维数组
特点:同一数组中的所有元素都属于同一种数据类型(int char float)数组元素用数组名和相应的下标来确定
1.一维数组的定义
格式:类型名 数组名[常量/常量表达式];
-
如
float s[25];
、float s[5*5];
-
表达式不能含有变量,表达式的值必须要大于零且为正整数
-
此为错误定义:
int N=9; int a[N];
-
此为正确:
#define N 10 int a[N];
-
使用时可以是常量或者表达式,如:
a[i] = 2;
2.一维数组的初始化
格式:类型名 数组名[常量表达式]={初值1,初值2,…};
-
定义一维数组时可以将各元素的初始值依次放在一对{}中赋给数组(必须用{}将初值括起,且初值之间用一个逗号分隔)
-
int a[5]={19,45,66,90,100,80};
-
{}内:多则出错;少则补0
-
定义赋初值的个数等于数组长度,则数组长度可以省略,如:int a[ ]={2,3,4,5,6};
-
只能在定义数组的同时用{}给数组元素整体赋值
二、二维数组
1.二维数组的定义
格式:类型名 数组名 [常量表达式1][常量表达式2];
-
第一个方括号常量表示行数,第二个方括号常量表示列数
-
{}内:多则出错;少则补0
-
表达式不能含有变量,表达式的值必须要大于零且为正整数
2.二维数组的初始化
-
方法1:将初值依序放在一对{}中,与一维数组初始化格式相同
- 例如:
int a[2][3]={1,2,3,4,5};
、int a[2][3]={1,2,3,4,5,6};
- 例如:
-
方法2:定义二维数组同时,按行初始化每一行初值均用一对{}括起,采用嵌套的{}格式
- 例如:
int a[2][3]={ {1,2,3} , {4,5}};
、int a[2][3]={ {1,2,3},{3,4,5}};
、int a[2][3]={0};
- 例如:
初始化可以省略行数,但列数不能省略
错误案例:int a[][3];(没有初始化)、int a[2][]={1,2,3,4,5,6};
正确案例:int a[][3]={1,2,3,4,5,6};
三、字符串
C语言中没有字符串变量,那么如何存储?
-
方法1:字符数组来存放
-
方法2:字符型指针变量
1.字符数组的初始化
char s[]={‘a’,’b’,’c’,’d’,’e’};
与其它类型数组的初始化方式一样,只是其初 始值是字符
2.字符串
因为字符串最后都有一个字符串结束符(’\0’),所以用字符数组来存放字符串时一定要有一个 元素存放结束符’\0’
-
字符串常量后有一个’\0’。如:“abcd” 由5个字符组成,“” 等价于”\0”,是一个空字符串
-
用字符串给一字符数组进行初始化有三种情况
-
方法1:char a[]={”abcd”};
-
方法2:char a[]=”abcd”;
因为有双引号做分隔符了,因此外边的花括号可以省略
-
方法3:char a[]={‘a’,’b’,’c’,’d’,’\0’}
-
方法1,2,3长度都为5
-
3.字符串使用
1.字符串存储(赋值)四种方法
- 方法1:scanf( );键盘输入
例:char a[10]; scanf(“%s”,a); 合法
scanf(“%s”,&a); 非法
用%s格式输入时,遇到空格符或回车符则自动结束输入
例:scanf(“%s,%s”,a,b); 不能正确读取数据
scanf中多个%s时不能中间加逗号,要连续写%s%s
方法1:printf( );输出
例:char s[10];
scanf(“%s”,s); 输入:ab cd<回车>
printf(“%s”,s); 输出:ab
输入ab后加空格,空格会被认为是’\0’从而终止输入,输入回车亦如此
- 方法2:gets( )键盘输入
格式:#include<stido.h>
gets(字符数组)
例:char str1[10]; gets(str1);puts(str1);
输入:ab cd<回车>
输出:ab cd
使用该函数输入字符时,只有遇到回车符系统才结束读取字符,空格不会结束
不论是用%s还是gets()在输入时均不需要输入双引号,若输入时用了双引号则双引号也作为字符串的有效字符
方法2:puts( )输出
格式:#include <stdio.h>
puts(字符数组/字符串常量)
例:puts(“abc”);puts(“defg”);
输出结果: abc
defg
该函数将 ’\0’转成’\n’输出,每次输出光标会在下一行开始
2.字符串函数
-
第1个函数:strcat()
-
格式: #include<string.h> strcat(字符数组1,字符数组2/字符串)
-
功能:“连接”
-
从字符数组1的’\0’开始链接,数组2的’\0’也链接进去
-
函数返回数组1的首地址
-
字符数组1必须足够大
-
-
第2个函数: strcpy()
-
格式: #include<string.h> strcpy(字符数组1/字符串,字符数组2/字符串)
-
功能:将字符数组2中的字符串替换到字符数组1中。函数值为字符数组1的首地址
-
-
第3个函数: strcmp()
-
格式: #include<string.h> strcmp(字符数组1/字符串,字符数组2/字符串)
-
功能:函数返回值相同位置不同字符的ASCII码差值
strcmp( strcmp( abc “ ” ”, abc ); ” =>0 strcmp(“abc”,”abfc”);=>-3 strcmp(“abc”,”ab”);=>99
不能用关系运算符直接进行字符串大小或字符数组大小的比较
“abc”==”abc”
“abc”>”ab”
-
-
第4个函数: strlen( )
-
格式: #include<string.h> strlen(字符数组)
-
功能:求出字符数组的实际长度(不包括结束符)
ch [10] ”4332567” har a[10]=”4332567”; printf(“%d”,strlen(a)); //len=7 char a[]=”abc\018\0”; printf(“%d”,strlen(a)); //len=5 // '/'后面会结合八进制,然后算一个
-