昨天我们学习了一维整形数组的有关知识,今天我们学习一维字符数组与二维数组。知识点如下,分享给正在入门C语言的小伙伴。
一、一维字符型数组
C语言里面没有专门的字符串类型,我们平时操作字符串,全部依靠字符型数组实现,这是一个关键点。
- 字符数组基础定义
格式:
char 数组名[元素个数];
这里要注意: - 方括号里的元素个数必须是常量,不能用变量;
- 数组容量一定要留足空间,字符串末尾自带结束符’\0’,存储字符串时,需要多占用1个位置存放它。
定义示例:
char str[20];
可以通过下标单独访问每一个字符:str[0]、str[1]……
存储空间大小区分
char str[20];
数组占用空间 = 数组元素总个数。
我们可以用 sizeof(a)/sizeof(a[0]) 计算数组一共拥有多少个元素。
但是sizeof 和后面会提到的strlen完全不是一个东西,不可混淆。字符数组初始化
初始化不等于赋值,数组定义完成后,不能直接写 str=“hello”。
几种合法初始化方式:
1. 完整初始化
char str[6]={‘h’,‘e’,‘l’,‘l’,‘o’,‘\0’};
char str[6]={“hello”};
char str[6]=“hello”;
2. 局部初始化
没有手动赋值的元素,系统会自动初始化为0,也就是等价于’\0’。
char str[6]={‘h’,‘e’,‘l’};
3. 默认初始化
char str[]=“hello”;
其中默认初始化日常练习可以用,但正式代码不推荐。
注意:
0:数字零
‘\0’:字符串结束符,ASCII值等价于0
‘0’:字符0,ASCII值是48,三者千万不要混淆!
字符串输出
- printf(“%s”, str);
- puts(str);
puts打印字符串之后,会自动额外输出一个换行符。
字符串接收输入
- scanf(“%s”, str);
遇到空格就停止读取,不能接收带空格的句子。 - gets(str);
是危险函数,编译器会警告,存在缓冲区溢出风险,尽量少使用。
- scanf(“%s”, str);
字符串常用操作(库函数)
使用这些函数需要引入头文件 <string.h>
- strlen() — 获取字符串有效长度
从开头计数,直到遇见’\0’,不包含结束符。 - strcpy() — 字符串拷贝
strcpy(str,“hello world”);
目标数组空间必须足够大,能够放下完整字符串,否则发生越界。 - strcat() — 字符串拼接
strcat(str1,str2);
把str2接到str1末尾,str1剩余空间要足够容纳拼接后的全部字符。 - strcmp() — 字符串比较
ret = strcmp(str1,str2);
规则:从左向右逐个对比字符ASCII码
返回 0:两个字符串完全相等
返回 >0:str1大于str2
返回 <0:str1小于str2
不能直接用 == 判断两个字符串是否相等!这是新手高频错误。
二、二维整型数组
定义格式
int 数组名[行数][列数];
int a[2][3];
行数、列数都必须是常量。访问方式
a[0][0]、a[0][1]、a[1][0]存储规则
二维数组在内存里逐行连续存放。
可以简单理解:二维数组就是由多个一维数组组成的数组。初始化
- 全部初始化
int a[2][3]={1,2,3,4,5,6};
int a[2][3]={{1,2,3},{4,5,6}}; - 局部初始化
未赋值元素自动初始化为0
int a[2][3]={1,2,3,4}; - 省略行数初始化
注意:行可以省略,列绝对不能省略
int a[][3]={1,2,3,4,5,6};
- 全部初始化
看到这里今天的内容就已经结束了。
我想提醒大家一维字符数组是现阶段的重中之重,C语言字符串所有操作都建立在它之上。