在探究字符数组之前,我们再来复习一下字符串相关的知识点吧。
1. 字符串常量
#include <stdio.h>
int main()
{
printf("sizeof HelloWorld = %d\n", sizeof("HelloWorld"));
return 0;
}
字符串常量"HelloWorld"
占用11个字节。
字符串常量在内存中,由每个字符的ASCII码按照顺序排列构成,每个字符仅占一个字节,并且末尾会附上一个数值0,指示字符串结尾。
字符'0'对应的ASCII码为十进制48。而标记字符串结尾的数值0,为了不与字符'0'冲突,使用转义序列'\0'表示。
更多内容请参考字符常量及字符变量。
2. 用字符数组存储字符串
既然字符串满足数组的类型相同且顺序排列的特点。那么元素为char
的数组可以用于存储字符串。
2.1 初始化字符数组
我们声明一个数组,且把它初始化为"HelloWorld"
char str[20] = {'H', 'e', 'l', 'l', 'o', 'W', 'o', 'r', 'l', 'd'};
由于数组有20个元素,而初始化列表中仅有10个元素。数组大小大于初始化列表长度,数组后10个将会被初始化为0。也就相当于已经帮我们标记了字符串结尾了。
还有一种更加便捷的字符数组初始化方式。将初始化列表直接写成一个字符串常量,可以用于初始化字符数组。
char str[20] = "HelloWorld";
由于字符串常量末尾会自动添加'\0'为字符串结尾标识,所以当用字符串常量初始化字符数组时,代码等价于:
char str[20] = {'H', 'e', 'l', 'l', 'o', 'W', 'o', 'r', 'l', 'd', '\0'};
2.2 省略数组大小
有时候我们希望一个数组被初始化为某个字符串,但是又不想数清楚到底有多少个字符。我们可以在数组声明时,省略数组大小,初始化列表中的元素个数即为数组的大小。
char str1[] = "HelloWorld";
char str2[] = {'H', 'e', 'l', 'l', 'o', 'W', 'o', 'r', 'l', 'd', '\0'};
上面两种写法是等价的,数组的大小为初始化列表中元素的个数,即11。
2.3 打印字符数组
接下来,我们想让这串字符串被打印在控制台上。
printf的第一个参数可以接收一串字符串。所以我们可以直接把数组作为printf的第一个参数。
printf("HelloWorld");
//使用数组
printf(str);
另外,转换规范%s
,可以作为字符串的占位符。
printf("%s", str);
将字符数组打印在控制台:
#include <stdio.h>
int main()
{
char str[20] = {'H', 'e', 'l', 'l', 'o', 'W', 'o', 'r', 'l', 'd'};
printf(str);
printf("\n");
printf("%s", str);
printf("\n");
return 0;
}