C语言中的特殊数组-字符数组(上)-学习笔记-6

字符数组

由于 C 语言比较接近底层,所以,C 语言中并没有字符串数据类型,所以我们使用数组将一个一个的字符连成串。

定义字符数组

用来存放字符的数组,就是字符串数组。字符数组中的每一个元素都存储着一个字符。
定义字符数组的方法和普通数组类似,就是数组类型换了。

1
2
3
4
5
6
7
8
9
10
11
12
13
char text[20];
//定义了一个数组长度为 20 的 text 字符数组。
text[0]="I";
text[1]=" ";
text[2]="A";
text[3]="M";
text[4]=" ";
text[5]="C";
text[6]="O";
text[7]="D";
text[8]="E";
text[9]="R";
//逐个给数组的前 10 个元素赋值。

上面的代码中,我们声明了一个 char 类型的数组,然后将数组中的每一个元素进行赋值。

因为字符型数据是以整数形式(ASK II 代码)存放的,既然是整数形式存放,所以我们也可以用整型术组存放字符数据。
例如:

1
2
3
int C[10];
C[0]='a';
//我们虽然定义的是整型数组 C ,但同样可以存放字符内容。

注意
这样虽然合法,但是十分浪费存储空间。

字符数组的初始化

和其他数组一样,在使用字符数组时,我们同样需要将其进行初始化操作。

利用初始化列表进行初始化

我们可以一次性的将数组的所有元素都表示出来

1
char C[13] = {'I',' ','a','m',' ','a',' ','c','o','d','e','r','!'};

上面,我们依次将数组的所有元素都进行了初始化,中间还包含空格。

注意

  1. 如果我们不初始化,那么结果将不可预料
  2. 如果字符个数大于数组长度,那么将会报语法错误
  3. 如果字符个数小于数组长度,没初始化的元素为\0

不规定数组长度初始化

我们也可以不规定字符数组的长度来进行初始化,那么数组的长度会根据数组实际包含的元素个数来计算。

1
2
char C[] = {'I',' ','a','m',' ','a',' ','c','o','d','e','r','!'};
//根据元素的个数,判断数组长度。

输出引用字符数组中的内容

既然我们声明并且初始化了字符数组,那么该如何输出引用这些内容呢?
其实和输出普通数组的元素相同

1
2
3
char C[] = {'I',' ','a','m',' ','a',' ','c','o','d','e','r','!'};
printf("第一个字符是:%c",c[0]);
//输出的结果就是第一个字符 I

如果我们想将字符串中的所有字符都输出出来,可以利用一个循环结构,遍历数组中的全部内容。

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
int main(){
char C[] = {'I',' ','a','m',' ','a',' ','c','o','d','e','r','!'};
for(int i=0;i<=13;i++){
printf("%c",C[i]);
}
//遍历 C 数组,然后输出数组内容
printf("\n");
return(0);
}

输出一个二维字符数组

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
int main(){
char lx[5][5]={{' ',' ','*',' ',' '},{' ','*',' ','*',' '},{'*',' ',' ',' ','*'},{' ','*',' ','*',' '},{' ',' ','*',' ',' '}};
//定义一个二维的字符型数组
for(int i=0;i<5;i++){
for(int n=0;n<5;n++){
printf("%c",lx[i][n]);
}
printf("\n");
}
//遍历二维数组,然后依次将二维字符数组输出
}

输出结果是

字符串和字符串结束标志

如果我们设定一个字符数组的长度为100,将40个元素赋值,那么我们如果想知道这段文字有多少个字符的时候,想要的是40而不是100,所以我们在40后面加一个字符串的结束标志,表示这段字符串结束了。
我们看一下的集中字符型数组的初始化

1
2
3
4
5
6
char 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
2
3
4
5
6
char A[]={'C','h','i','n','a'};
//上面的 A 的数组长度为5
char B[]="China";
//上面这种赋值方式的数组长度是6,因为后面多了一个`\0`。
char C[10]="China";
//上面这种赋值方式,数组长度是11,第 6 位是`\0`,从7到10这4位为自动填充的`\0`。

所以,结束标志大概就是,如果遇到\0就停止输出字符。

举例

1
2
3
4
5
6
7
8
9
10
char C[10]="China";
//上面的 C 在内存中实际存储的应该是
//C h i n a \0 \0 \0 \0 \0
//如果我们通过数组元素赋值的方式,将 Ch 换乘 Hi
C[5]='H';
C[6]='i';
//那么此时,我们再输出的时候,结果是 ChinaHi ,因为 China 后面没有 \0 作为结束标志
C[6]='H';
C[6]='i';
//如果我们将 C[6] 替换成为 H ,C[7] 为 i 的话,将不会显示 Hi 这两个字符,因为已经遇到了\0结束符,字符串将不再输出了;

完整例子

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
int main(){
char C[10]="China";
printf("%s",C);
printf("\n");
C[6]='H';
C[7]='i';
printf("%s",C);
printf("\n");
}

所以在一次性输出字符串时,使用%s输出时,会检查字符串中有没有\0,遇到\0则自动停止。

字符数组的输入输出

之前,我们一直使用%c进行文本的输出,但是%c只能输出一个字符,如果需要一次输入或输出整个字符串,需要使用%s的格式符,%s意思是对字符串(string)的输入和输出。

使用方法

我们一次性定义一个字符型数组,然后一次性用printf输出出来。

1
2
3
char c[]="I am coder!";
printf("%s",c);
//这里我们使用 C,数据的地址直接使用数组 C

这样可以直接输出 C 字符串包含的所有内容。

注意
还记得我们上面讲的嘛?遇到\0就停止输出,所以使用%s时一定要注意。

使用注意事项

  1. 输出的字符串中不包含\0
  2. printf 中的输出项是字符数组的名称,而不是某一个元素。
1
2
3
4
printf ("$s",C[4]);
//这样是错误的
printf("%s",C);
//这样是正确的,使用数组名而不是元素
  1. 如果一个字符数组中,包含一个以上的\0,那么遇到第一个的时候,就停止输出。

使用 scanf 函数输入字符串

scanf 函数的格式:

1
scanf ("%s",C);

使用方法和 printf 相似,前面是格式符,后面是数据项。
后面的 C 是已经定义好的字符型数组的数组名
如果需要输入多个字符串,在输入时需要用空格进行分隔。

1
2
3
4
char s1[5],s2[5],s3[5];
scanf ("%s,%s,%s",s1,s2,s3);
//我们在输入时,应该吧 s1、s2、s3 的字符串之间使用空格隔开
//输入:How are you?

s1为:H o w \0 \0
s2为:a r e \0 \0
s3为:y o u ! \0

如果我们只定义一个字符串

1
2
3
char str[15];
scanf("$s",str);
//同样输入:How are you?

这样 str 数组只会接收到 How,因为空个之后,就是下一个字符串的内容了。

提示
为什么 scanf 和 printf 后面的数据项都不用加 & 符号呢?
因为数组名就代表着这个数组的起始地址

1
2
3
char C[5];
printf("%o",C);
//这里打印的就是 C 数组的起始位置。

尾巴

这是我的个人学习笔记,主要是应付考研复习使用,充斥着一些吐槽和个人观点,并不严谨,欢迎大家参考、指正。


-------------The End-------------
欢迎请我喝咖啡哦~!