- 基础语法
- 简单数组
- 声明数组
- 初始化数组
- 下标访问
- 计算数组长度
- 数组使用小结
- 字符与字符串
- char 字符
- 宽字符
- 字符串 (String)
- 字符串与普通数组的区别
- 小拓展:
- 字符串的常用函数
- 字符串长度
- 比较字符串内容
- 字符串的复制
- 字符串的拼接
- 简单数组
基础语法
简单数组
把具有相同类型的若干个数据按一定顺序组织起来,这些同类数据元素的集合就称为数组。数组元素可以是基本数据类型,也可以是结构体类型。注意,C语言中的数组与其他编程语言的数组或列表有相似性,但本质上又有不同。
声明数组
代码语言:javascript复制1 // 声明格式:类型 数组变量名[长度]
2 // 声明数组时需指明元素类型和长度(元素个数),且[]中的长度必须为常量
3 int arr[10];
初始化数组
C语言数组在使用前应当初始化,否则数组中的数据是不确定的,由此会造成一些不可预知的问题。
代码语言:javascript复制 1 // 声明的同时,使用字面量初始化。即大括号初始化
2 int arr[10] = {0,1,2,3,4,5,6,7,8,9};
3
4 // 可以只指定部分元素的值,剩下的元素将自动使用0值初始化
5 int arr[10] = {0,1,2,3,4}; //数组元素:0,1,2,3,4,0,0,0,0,0
6
7 // 使用大括号初始化时,中括号中的长度可以省略,编译器将按照实际的个数来确定数组长度
8 int arr[] = {0,1,2,3,4,5,6,7,8,9};
9
10 // 不需要指定每个元素具体值,仅做零值初始化时,可以使用如下写法
11 int arr[10] = {0}; // 数组的每个元素都会被初始化为0
需要注意,使用大括号初始化数组时,大括号中不能为空,至少要写一个值。如int arr[10] = {};
语法错误!
下标访问
要访问数组中的任意一个元素,都可以通过数组下标访问。因为数组是有顺序的,下标就是元素的序号。但是要注意,数组的第一个元素的序号是0,也就是说下标是从0开始的。
代码语言:javascript复制1 int a[6] = {12,4,5,6,7,8};
2
3 // 打印数字中的元素。使用: 数组变量[下标]的格式获取元素
4 printf("%d n",a[0]);
5 printf("%d n",a[1]);
在这里插入图片描述 遍历数组
代码语言:javascript复制 1 int a[6] = {12,4,5,6,7,8};
2
3 // 使用for 循环来访问数组中的每一个元素
4 for(int i=0;i<6;i ){
5 printf("%d n",a[i]);
6 }
7
8 // 使用for循环修改数组元素
9 for(int i=0;i<6;i ){
10 a[i] = i 2;
11 printf("%d n",a[i]);
12 }
要注意,在访问数组元素时,[]括号中的下标可以是整型变量。
计算数组长度
虽然我们可以明确的知道数组的长度,但有时候我们需要编写更友好更易于维护的代码,例如数组的长度经常修改,则我们需要修改每一处使用数组长度的地方,不易于维护,因此我们需要能动态的计算出数组长度,而不是将长度写死。
前面我们已经多次使用过sizeof
运算符,该运算符可以获取类型或变量的内存大小,那么我们可以使用它获得数组总内存大小(即数组占用多少内存),然后用总内存大小除以每一个元素占用的内存大小,就可以获得数组的长度了。由于数组存放的都是同一种类型数据,因此每一个元素占用的内存大小都是固定且相等的。
1 int a[6] = {12,4,5,6,7,8};
2
3 // 计算数组长度。数组总内存大小/每个元素内存大小
4 int len = sizeof(a)/sizeof(int);
5 for(int i=0;i<len;i ){
6 printf("%d n",a[i]);
7 }
如上例,当修改数组大小时,只需要修改数组a
的声明大小,其他地方不需做任何修改。
数组使用小结
- 声明数组时,数组长度必须使用常量指定
- 数组应当先初始化再使用
- 数组的下标(序号)是从0开始的
- 访问数组时必须做边界检查。例如数组a的长度为5,则使用
a[5]
访问是错误的。a[5]
表示的是数组的第6个元素,访问超出数组长度的元素会导致程序异常退出。如果数组长度是n
,则当a[i]
访问时,应当保证i < n
字符与字符串
如果对于字符、字符编码这些不是非常清楚,或者说是一知半解,建议先看看博主的另一篇科普文章,对与字符与字符编码有了更深入的理解再学习以下内容。
《字符编码的前世今生——一文读懂字符编码》
char 字符
C语言中字符是非常简单的,同时也意味着非常原始!
代码语言:javascript复制1 // 声明一个字符变量
2 char s = 'a';
在C语言中,字符类型的字面量是单引号括起来的一个字符,注意,字符不是字符串,它只能写一个。且char
类型的字符只能表示ASCII
表中的字符。实际上,C语言的char
就是一个整数,它的范围是0~127
1 char s = 'a';
2 char s1 = 97;
3
4 // 可以看到,s和s1打印的结果完全相同
5 printf("%c n",s);
6 printf("%c n",s1);
7
8 // 以整数形式打印字符`a`
9 printf("%d n",s);
char
保存的这个整数也就是每个字符对应的编号,具体的内容我们可以查看ASCII
表
在这里插入图片描述
仔细观察这张表,我们可以发现一个好玩的规律,所有大写字母的编号都比它对应的小写字母小32。例如a
的编号是97,则A
的编号是97-32=65
。发现这个规律,我们就能非常简单的实现大小写字母的转换了。
1 char s1 = 'c';
2 char s2 = 'G';
3
4 printf("%c n", s1-32); //小写转大写
5 printf("%c n", s2 32); //大写转小写
打印结果
代码语言:javascript复制1 C
2 g
由于char
本质上是整数类型,因此可以直接进行算术运算。
宽字符
有些朋友已经发现了,char
类型是C语言发展的早期,未考虑地区性字符的产物。简单说就是不能表示中文。直接char s1 = '中';
这样写编译会报错的,后续当然是要出台补救措施,宽字符就是补救措施的产物。需要注意,这里宽字符概念仅作为知识拓展,这种解决方案基本被时代所遗弃,仅部分陈旧项目或某些系统内部编码使用。
1 #include <stdio.h>
2
3 // 使用宽字符,需包含头文件
4 #include <wchar.h>
5
6 int main(){
7 // 声明宽字符,字面量前需加上大写L
8 wchar_t s = L'中';
9
10 printf("size is %d n",sizeof(wchar_t));
11 printf("code = %d n",s);
12 }
13
打印结果:
代码语言:javascript复制1 size is 2
2 code = 20013
可以看到,这里宽字符中
的编号是20013,显然一个字节是存不了这么大的整数的,因此宽字符使用两个字节来存字符的编号。这就是为什么被称为宽字符的原因,它比char
要宽,使用两个字节16位表示。
在中国大陆区的Window系统中,默认使用的编码表是GBK,并且Windows还使用一种页的概念来表示编码表,而GBK编码表对应的就是page 936
,也就是第936页表示GBK编码。如要查看GBK编码表,可将page 936
的内容下载下来查看,链接地址 复制该连接地址,选择目标另存为即可下载该txt文件
打印输出宽字符,比直接打印char
要麻烦
1 #include <stdio.h>
2 #include <wchar.h>
3
4 // 使用setlocale需包含头文件
5 #include <locale.h>
6
7 int main(){
8 wchar_t s = L'中';
9
10 // 需先设置本地的语言环境,第二个参数传"",表示使用本机默认字符集
11 setlocale(LC_ALL, "");
12
13 // 两种打印宽字符的方式,其中wprintf为宽字符专用函数
14 wprintf(L"%lc n",s);
15 printf("%lc n",s);
16 }
17
字符串 (String)
所谓字符串,顾名思义,就是将许多单个字符串成一串。既然要把多个字符串起来,当然就需要用到上面说的数组了,存放char
类型元素的数组,被称为字符数组。由于C语言没有专门为字符串提供单独的类型,因此只能使用字符数组的方式来表示字符串,这是与其他编程语言很大不同的地方,也是比较繁琐的地方,如果说其他高级语言是自动挡的小轿车,那么C语言就是手动挡的轿车。
声明并初始化字符串
代码语言:javascript复制 1 //1. 与普通数组相同,用花括号初始化
2 char str1[30] = {'h','e','l','l','o','w','o','r','l','d'};
3 char str2[20] = {"hello world"}; //字符数组的特殊方式
4
5 //2. 字符数组特有的方式。使用英文双引号括起来的字符串字面量初始化
6 char str3[20] = "hello world";
7
8 //3. 省略数组长度
9 char str4[] = {"hello world"};
10
11 //4. 省略数组长度,并使用字符串字面量初始化
12 char str5[] = "hello world";
在C语言中声明字符串,推荐以上第4种方式,它具有简洁且能避免出错的优点。
字符串与普通数组的区别
在C语言中,虽说字符串是用字符数组来表示的,但是字符串和普通字符数组仍然是不同的,这两者的区别可以简单总结为如下三点
- C语言字符串规定,结尾必须包含一个特殊字符
'