首页 > 编程笔记 > C语言笔记 阅读:270

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

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

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

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

字符数组的概念

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

在 C语言程序中,字符数组最常见的用途是表示字符串,而字符串是以空字符 \0ASCII 值为 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,因此数组大小必须至少为字符串长度加 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()%sputs() 输出字符串,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 列的二维数组,每行存储一个字符串。

字符数组注意事项

总结

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

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

相关文章