6-3. 字符串与字符数组

  • 学习人数 30K+
  • 适合所有人群学习
avatar
林耿亮

你好编程主讲老师

在探究字符数组之前,我们再来复习一下字符串相关的知识点吧。

1. 字符串常量

#include <stdio.h>
int main()
{
    printf("sizeof HelloWorld = %d\n", sizeof("HelloWorld"));
    return 0;
}

sizeof helloworld

字符串HelloWorld内部存储

字符串常量"HelloWorld"占用11个字节。

字符串常量在内存中,由每个字符的ASCII码按照顺序排列构成,每个字符仅占一个字节,并且末尾会附上一个数值0,指示字符串结尾。

字符'0'对应的ASCII码为十进制48。而标记字符串结尾的数值0,为了不与字符'0'冲突,使用转义序列'\0'表示。

字符0的ASCII

更多内容请参考字符常量及字符变量

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;
}

helloworld装入数组中