C语言中的字符数组(非常详细)

2025-08-13 02:30:38

所谓字符数组,就是专门存放字符的数组。

在 C 语言中,字符数组本质上是 char 类型的数组,但由于字符的特殊性质(比如可以组成字符串),它在编程中有着独特的地位和用法。

学习字符数组之前,相信读者已经掌握了 C 语言数组的基本用法。接下来,我们将直接聚焦讲解字符数组,包括它的特点、声明、初始化、操作以及与字符串的关系。

字符数组的概念

C语言中的字符数组,指的就是存储 char 类型元素的一维数组,每个元素占用 1 个字节(8 位),可以存储一个字符(如 'A'、'b'、'1' 等)。

在 C语言程序中,字符数组最常见的用途是表示字符串,而字符串是以空字符 \0(ASCII 值为 0)结尾的字符序列。以下是字符数组的两种主要形式:

普通字符数组:单纯存储字符,不一定以 \0 结尾。

字符串:以 \0 结尾的字符数组,用于表示文本。

例如,char str[5] = {'h', 'e', 'l', 'l', 'o'}; 是一个普通字符数组,而 char str[6] = {'h', 'e', 'l', 'l', 'o', '\0'}; 是一个字符串。

字符数组的声明与初始化

1) 声明字符数组

声明字符数组的语法与普通数组相同,只不过类型是 char:

char 数组名[大小];

示例:

char letters[5];

这声明了一个能存储 5 个字符的数组。如果不初始化,其内容是未定义的。

2) 初始化字符数组

字符数组的初始化有多种方式,尤其在处理字符串时更为灵活:

char str[6] = {'h', 'e', 'l', 'l', 'o', '\0'}; // 逐个字符初始化

char str[] = "hello"; // 字符串字面量初始化,自动包含 \0

char str[10] = "hi"; // 部分初始化,等价于 {'h', 'i', '\0', '\0', ...}

逐个字符初始化:

字符串字面量初始化(推荐):

部分初始化:未指定的部分填充为 0(即 \0)。

注意:使用字符串字面量时,编译器会自动添加 \0,因此数组大小必须至少为字符串长度加 1。

字符数组与字符串的区别

字符数组不一定是字符串,只有以 \0 结尾的字符数组才会被视为字符串。

以下是一个对比示例:

#include

int main() {

char arr[5] = {'a', 'b', 'c', 'd', 'e'}; // 普通字符数组

char str[6] = "abcde"; // 字符串

int i;

printf("字符数组:");

for (i = 0; i < 5; i++) {

printf("%c ", arr[i]);

}

printf("\n字符串:%s\n", str);

return 0;

}

输出结果:

字符数组:a b c d e

字符串:abcde

在这个例子中,arr 没有 \0,所以不能用 %s 直接输出,否则会导致未定义行为。而 str 是合法的字符串,可以直接用 printf() 的 %s 格式化。

访问与修改字符数组

字符数组的元素通过下标访问,从 0 开始。可以用循环或直接操作单个元素:

#include

int main() {

char str[] = "hello";

printf("原始字符串:%s\n", str);

str[0] = 'H'; // 修改第一个字符

printf("修改后字符串:%s\n", str);

return 0;

}

输出结果:

原始字符串:hello

修改后字符串:Hello

注意:不能直接用赋值操作修改整个字符串(如 str = "world"),因为数组名是指针常量,只能逐个修改元素。

字符数组的常用操作

1) 计算字符串长度

C语言提供了 strlen() 函数(需包含 ),用于计算字符串长度(不包括 \0)。也可以手动实现:

#include

int main() {

char str[] = "hello";

int length = 0;

while (str[length] != '\0') {

length++;

}

printf("字符串长度:%d\n", length);

return 0;

}

输出结果:

字符串长度:5

2) 复制字符串

可以用 strcpy() 函数复制字符串,或者手动实现:

#include

int main() {

char src[] = "hello";

char dest[10];

int i = 0;

while (src[i] != '\0') {

dest[i] = src[i];

i++;

}

dest[i] = '\0'; // 手动添加结束符

printf("复制后的字符串:%s\n", dest);

return 0;

}

输出结果:

复制后的字符串:hello

3) 输入字符串

可以用 scanf() 或 gets()(后者不安全,不推荐使用)输入字符串。更安全的做法是使用 fgets():

#include

int main() {

char str[20];

printf("请输入一个字符串:");

fgets(str, 20, stdin); // 从标准输入读取,最多 19 个字符加 \0

printf("你输入的是:%s", str);

return 0;

}

输出结果(假设输入 "hi there"):

请输入一个字符串:hi there

你输入的是:hi there

fgets() 会保留换行符 \n,可以用循环去除。

4) 输出字符串

使用 printf() 的 %s 或 puts() 输出字符串,puts() 会自动换行:

#include

int main() {

char str[] = "hello";

puts(str); // 输出并换行

return 0;

}

输出结果:

hello

多维字符数组

字符数组可以扩展为二维形式,常用于存储多个字符串。例如:

#include

int main() {

char words[3][10] = {"apple", "banana", "cherry"};

int i;

for (i = 0; i < 3; i++) {

printf("%s\n", words[i]);

}

return 0;

}

输出结果:

apple

banana

cherry

这里,words 是一个 3 行 10 列的二维数组,每行存储一个字符串。

字符数组注意事项

字符串结束符:忘记留空间给 \0 会导致越界或乱码。例如,char str[5] = "hello" 是错误的,需用 char str[6]。

缓冲区溢出:输入时若超过数组大小,可能覆盖其他内存,引发严重错误。

不可直接赋值:不能用 = 直接给字符数组赋新字符串,需用 strcpy()。

总结

字符数组是 C语言中处理文本的常用工具,尤其是与字符串密切相关。

阅读完本文,你已经掌握了字符数组的基本用法。字符数组看似简单,但它是理解指针、内存管理和字符串库函数(如 strcat()、strcmp())的基础。建议读者多实践,比如尝试编写字符串反转或拼接程序,以加深理解。

iPad充不进去电
【原】成龙不是专业歌手,为啥还这么频繁的登台演唱唱歌?(成龙的歌单推荐)