C语言中的字符数组(非常详细)
所谓字符数组,就是专门存放字符的数组。
在 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 <stdio.h> 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 <stdio.h> 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()
函数(需包含 <string.h>
),用于计算字符串长度(不包括 \0
)。也可以手动实现:
#include <stdio.h> int main() { char str[] = "hello"; int length = 0; while (str[length] != '\0') { length++; } printf("字符串长度:%d\n", length); return 0; }
输出结果:
字符串长度:5
2) 复制字符串
可以用 strcpy()
函数复制字符串,或者手动实现:
#include <stdio.h> 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 <stdio.h> 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 <stdio.h> int main() { char str[] = "hello"; puts(str); // 输出并换行 return 0; }
输出结果:
hello
多维字符数组
字符数组可以扩展为二维形式,常用于存储多个字符串。例如:
#include <stdio.h> 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()
)的基础。建议读者多实践,比如尝试编写字符串反转或拼接程序,以加深理解。