-
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())的基础。建议读者多实践,比如尝试编写字符串反转或拼接程序,以加深理解。