C 语言字符串数组

17 Mar 2025 | 4 分钟阅读

数组是 C 语言中最简单的数据结构,它将同类数据存储在连续的内存位置中。如果我们要创建一个数组,需要声明数据类型并为其赋予元素。

输出

1 2 4 2 4

在 C 语言中,字符和字符串是两种不同的数据类型,这与其他编程语言(如 Python)不同。字符串是字符的集合。因此,要定义一个字符串,我们使用字符数组。

输出

Enter a String: Hello
Hello

现在,我们想创建一个字符串数组,这意味着我们试图创建一个字符数组的数组。我们有两种方法可以实现这一点:

  1. 使用二维数组
  2. 使用指针

使用二维数组

创建字符串数组是二维数组的应用之一。为了更好地理解其排列方式,请观察下面的表示:

假设我们想创建一个包含3个字符串的数组,每个字符串的大小为5。

An Array of Strings in C

字符串数组中的每个字符串都必须以空字符(null Character)结尾。这是 C 语言中字符串的一个特性。

创建二维数组的语法

创建字符串数组的语法

现在,让我们创建一个示例字符串数组。

  • 注意,当我们指定行数和列数时,需要将空字符计算在长度之内。

输出

String Array:
Black
Blame
Block
  • char Array[3][6] = {"Black", "Blame", "Black"} -> {{'B', 'l', 'a', 'c', 'k', '\0'}, {'B', 'l', 'a', 'm', 'e', '\0'}, {'B', 'l', 'a', 'c', 'k', '\0'}}
  • 我们不能直接操作数组中的字符串,因为字符串是不可变的数据类型。直接操作会导致编译器报错。

输出

[Error] assignment to expression with Array type
  • 我们可以通过引入字符串头文件并使用 strcpy() 函数来复制值。

输出

String Array:
Hello
Blame
Block

使用二维数组的缺点

假设我们想在一个数组中存储4个字符串:{"Java", "T", "point", "JavaTpoint"}。我们会像这样存储这些字符串:

An Array of Strings in C
  • 行数将等于字符串的数量,但列数将等于最长字符串的长度。
  • 分配给所有字符串的内存大小都将是最长字符串的大小,这会导致“内存浪费”。
  • 上图表示中的橙色部分就是被浪费的内存。

使用指针

通过使用指针,我们可以避免内存浪费的缺点。但是我们该如何做呢?

我们需要创建一个指向字符串的指针数组。因此,我们需要创建一个类型为“char*”的数组。这样,所有的字符串都存储在其他地方,占用的内存恰好是其所需的内存,而数组中的指针则指向这些内存位置,从而避免了内存浪费。更具体地说,数组中的指针指向字符串的第一个字符。

创建指针数组的语法

数据类型* 名称[] = {"值 1", "值 2"…};

创建字符串指针数组的语法

char* 数组[] = {"字符串 1", "字符串 2"…};

表示

An Array of Strings in C

现在,让我们创建一个示例字符串数组。

输出

String Array:
HI
UP
AT

总结

我们不能像创建普通数组那样创建字符串数组,因为字符串是字符的数组。我们有两种方法可以做到这一点:

1. 使用二维数组

使用这种方法的缺点是“内存浪费”,因为分配给数组中每个字符串的内存将是存储数组中最长字符串所需的内存。

2. 使用指针

使用指针,我们创建一个指向字符串的一维指针数组。采用这种方法可以消除“内存浪费”的缺点。