字符数组
由于 C 语言比较接近底层,所以,C 语言中并没有字符串数据类型,所以我们使用数组将一个一个的字符连成串。
定义字符数组
用来存放字符的数组
,就是字符串数组
。字符数组中的每一个元素都存储着一个字符。
定义字符数组的方法和普通数组类似,就是数组类型换了。
1 | char text[20]; |
上面的代码中,我们声明了一个 char
类型的数组,然后将数组中的每一个元素进行赋值。
因为字符型数据是以整数形式(ASK II 代码)
存放的,既然是整数形式存放,所以我们也可以用整型术组存放字符数据。
例如:
1 | int C[10]; |
注意
这样虽然合法,但是十分浪费存储空间。
字符数组的初始化
和其他数组一样,在使用字符数组时,我们同样需要将其进行初始化操作。
利用初始化列表进行初始化
我们可以一次性的将数组的所有元素都表示出来
1 | char C[13] = {'I',' ','a','m',' ','a',' ','c','o','d','e','r','!'}; |
上面,我们依次将数组的所有元素都进行了初始化,中间还包含空格。
注意
- 如果我们
不初始化
,那么结果将不可预料
。 - 如果字符个数
大于数组长度
,那么将会报语法错误
。 - 如果字符个数
小于数组长度
,没初始化的元素为\0
。
不规定数组长度初始化
我们也可以不规定字符数组的长度来进行初始化,那么数组的长度会根据数组实际包含的元素个数来计算。
1 | char C[] = {'I',' ','a','m',' ','a',' ','c','o','d','e','r','!'}; |
输出引用字符数组中的内容
既然我们声明并且初始化了字符数组,那么该如何输出引用这些内容呢?
其实和输出普通数组的元素相同
1 | char C[] = {'I',' ','a','m',' ','a',' ','c','o','d','e','r','!'}; |
如果我们想将字符串中的所有字符都输出出来,可以利用一个循环结构,遍历数组中的全部内容。
1 |
|
输出一个二维字符数组
1 |
|
输出结果是
字符串和字符串结束标志
如果我们设定一个字符数组的长度为100,将40个元素赋值,那么我们如果想知道这段文字有多少个字符的时候,想要的是40而不是100,所以我们在40后面加一个字符串的结束标志,表示这段字符串结束了。
我们看一下的集中字符型数组的初始化1
2
3
4
5
6char C[] = {'I',' ','a','m',' ','a',' ','c','o','d','e','r','!'};
//我们传统的数组型初始化方法
char C[]={"I am a coder!"};
//我么在字符型数组中,也可以这样赋值
char C[]="I am a coder!";
//我们甚至可以去掉花括号,这样的赋值方式是不是舒服多了?
注意
最后两种直接使用字符串来赋值的时候,C 字符数组的长度不是13而是14,因为在最后,系统还自动加上了一个\0
,这个和第一种最大的区别就是字符数组的长度不同,第一种是 13 第二种是 14 ,多了一个\0
,
例如:
1 | char A[]={'C','h','i','n','a'}; |
所以,结束标志大概就是,如果遇到\0
就停止输出字符。
举例
1 | char C[10]="China"; |
完整例子
1 |
|
所以在一次性输出字符串时,使用%s
输出时,会检查字符串中有没有\0
,遇到\0则自动停止。
字符数组的输入输出
之前,我们一直使用%c
进行文本的输出,但是%c
只能输出一个字符,如果需要一次输入或输出整个字符串,需要使用%s
的格式符,%s
意思是对字符串(string)的输入和输出。
使用方法
我们一次性定义一个字符型数组,然后一次性用printf
输出出来。
1 | char c[]="I am coder!"; |
这样可以直接输出 C 字符串包含的所有内容。
注意
还记得我们上面讲的嘛?遇到\0
就停止输出,所以使用%s
时一定要注意。
使用注意事项
- 输出的字符串中不包含
\0
; - printf 中的输出项是字符数组的名称,而不是某一个元素。
1 | printf ("$s",C[4]); |
- 如果一个字符数组中,包含一个以上的
\0
,那么遇到第一个的时候,就停止输出。
使用 scanf 函数输入字符串
scanf 函数的格式:
1 | scanf ("%s",C); |
使用方法和 printf 相似,前面是格式符,后面是数据项。
后面的 C
是已经定义好的字符型数组的数组名
。
如果需要输入多个字符串,在输入时需要用空格进行分隔。
1 | char s1[5],s2[5],s3[5]; |
s1为:H o w \0 \0
s2为:a r e \0 \0
s3为:y o u ! \0
如果我们只定义一个字符串
1 | char str[15]; |
这样 str 数组只会接收到 How,因为空个之后,就是下一个字符串的内容了。
提示
为什么 scanf 和 printf 后面的数据项都不用加 &
符号呢?
因为数组名
就代表着这个数组的起始地址
。
1 | char C[5]; |
尾巴
这是我的个人学习笔记,主要是应付考研复习使用,充斥着一些吐槽和个人观点,并不严谨,欢迎大家参考、指正。