Day7 内容梳理:
Chapter 5 数组 & 字符串
5.1 数组
(1)基础概念
格式1:数据类型 数组名[元素个数] = {值1, 值2, 值3...};
(元素个数处必须填常量,或者空着,填赋了值的变量不行)
格式2:数据类型 数组名[ ] ={值1, 值2……};
数组下标:数组名[下标]
(下标的含义并不是索引,而是偏移量,因此第一个元素的下标是0而非1)
数组在内存中占的大小 = 数据类型*元素个数
补充:如果没用完给定的个数,则剩下的值会初始化为0【代码3:int arr[10] = {1}】
(2)多维数组
①二维数组
格式1:数据类型 数组名[行数][列数] = {值1, 值2, 值3};
格式2:数据类型 数组名[行数][列数] = { {值1,值2},{值3,值4} };
索引也是从0开始,比如:数组名[0][0] = {......};
②多维数组
比如三维:数据类型 数组名[层][行][列] = {……};
5.2 字符串 & 字符数组
(1)二者区别:
C语言中没有字符串这种数据类型,但可以通过字符数组(char数组)来替代。可以说字符串是一种特殊的char数组,特殊的点在于以\0结尾。
以数字0结尾的char数组是一个字符串。
没有以数字0结尾的char数组就只是普通字符数组
需要注意的是,字符串一定以char数组的形式存在,但char数组未必一定是字符串。比如,如果以ASCII码的形式来存储char,输出的可能是符号而不是字符串。
例子:这是个char数组,但它不是字符串。它包含'\0'是因为需要一个结尾符,否则就报错。
例子:不包含'\0'所以导致报错
(2)字符串的输入函数(3种)
scanf():⭐比较万能
scanf()遇到空格或换行就结束,因此如果输入的是hello world,则只会存入hello。
❗ scanf()可以通过手动添加表达式来实现不同功能。
(1)接收空格的功能:写个表达式让它忽略空格:
注意符号:
\n之前的是尖括号,打出方式是shift+数字6。
另外,\n和尖括号之间不能有空格,否则也报错
放大版:
(2)限定输入的字符个数:在%和s之间手动添加可输入的个数,以避免字符个数超了。
比如:
#include<stdio.h>
int main(){
char ch[10]; //限定了10个位置
scanf(“%9s”, ch); //限制读入9个字符
printf("%s",ch);
return 0;
}
gets_s():
可以接收带空格的字符串
fgets()
需要传入三个参数,分别是输入字符的存放位置(也就是字符数组)、输入大小的限制(这里用sizeof()取了字符数组大小)、指针(stdin)
三者比较:
gets_s()和fgets()都可以接受空格。scanf()将空格和回车作为字符串结束的标志,但是可以通过手动添加"%[^\n]"来接收空格。
fgets()从字符串中获取的字符也默认包含了\n,但是当元素个数超出数组限制时,就没有\n了。它的缺点是会将\n作为字符的一部分也输入数组。
另外,对scanf()手动添加各种约束是可以使其既安全又具备很多功能,只是添加起来比较麻烦。
(3)字符串的输出函数(2种)
puts():
自带换行,遇到\0就停止。
fputs():
需要传入两个参数,是输出字符的存放位置(所定义的char数组)、指针(stdout)。
(4)计算字符串长度的函数
能计算第一个\0之前的有效长度。
之前的其他函数都是stdio库的,而strlen()函数是string库的,因此需要加一行导入库的代码: