C 语言中的字符串数组
在 C 语言中,字符串 是一个以 NULL 结尾的字符序列数组,它是一个一维字符数组。而字符串数组是一个字符串数组(字符数组)。
C 语言中的字符串数组是什么?
因此,字符串数组可以定义为 –
字符串数组是一个二维字符类型数组,其中每个字符数组(字符串)都以 NULL 结尾。
要声明字符串,我们使用语句 −
char string[] = {'H', 'e', 'l', 'l', 'o', '\0'}; Or char string = "Hello";
声明并初始化字符串数组
要声明字符串数组,您需要声明一个字符类型的二维数组,其中第一个下标表示字符串的总数,第二个下标表示每个字符串的最大大小。
要初始化字符串数组,您需要在双引号内提供多个字符串,并用逗号分隔。
语法
要构造字符串数组,请使用以下语法 -
char strings [no_of_strings] [max_size_of_each_string];
示例
声明并初始化一个字符串数组,用于存储 10 种计算机语言的名称,每种语言的最大长度为 15 个字符。
char langs [10][15] = { "PYTHON", "JAVASCRIPT", "PHP", "NODE JS", "HTML", "KOTLIN", "C++", "REACT JS", "RUST", "VBSCRIPT" };
打印字符串数组
可以使用 printf() 函数 和 %s 格式说明符打印字符串。要打印字符串数组中的每个字符串,可以使用for 循环,直到达到字符串的数量。
示例
在下面的示例中,我们声明、初始化并打印一个字符串数组 -
#include <stdio.h> int main (){ char langs [10][15] = { "PYTHON", "JAVASCRIPT", "PHP", "NODE JS", "HTML", "KOTLIN", "C++", "REACT JS", "RUST", "VBSCRIPT" }; for (int i = 0; i < 10; i++){ printf("%s ", langs[i]); } return 0; }
输出
运行此代码时,将产生以下输出 -
PYTHON JAVASCRIPT PHP NODE JS HTML KOTLIN C++ REACT JS RUST VBSCRIPT
注意:每个字符串的大小并不等于数组声明中的行大小。"\0"符号表示字符串终止,行中剩余的单元格为空。因此,分配给数组的很大一部分内存未被使用,从而被浪费了。
字符串数组在内存中是如何存储的?
我们知道每个 char 类型在内存中占用 1 个字节。因此,该数组将被分配一个 150 字节的内存块。虽然该块是可传染的内存位置,但每 15 个字节组成一行。
假设该数组位于内存地址 1000,则该数组的逻辑布局如下图所示 -

带有指针的字符串数组
为了更有效地使用内存,我们可以使用指针。我们声明一个"char *"类型的一维数组,而不是二维字符数组。
char *langs[10] = { "PYTHON", "JAVASCRIPT", "PHP", "NODE JS", "HTML", "KOTLIN", "C++", "REACT JS", "RUST", "VBSCRIPT" };
在二维字符数组中,字符串占用了 150 个字节。与此相反,在指针数组中,字符串占用的字节数要少得多,因为每个字符串都是随机分配的内存,如下所示 -

注意:此处,lang[ ] 是指向各个字符串的指针数组。

示例
我们可以使用for 循环如下来打印字符串数组 -
#include <stdio.h> int main(){ char *langs[10] = { "PYTHON", "JAVASCRIPT", "PHP", "NODE JS", "HTML", "KOTLIN", "C++", "REACT JS", "RUST", "VBSCRIPT" }; for (int i = 0; i < 10; i++) printf("%s ", langs[i]); return 0; }
输出
运行此代码时,将产生以下输出 -
PYTHON JAVASCRIPT PHP NODE JS HTML KOTLIN C++ REACT JS RUST VBSCRIPT
此处,langs 是一个指向包含 10 个字符串的数组的指针。因此,如果 langs[0] 指向地址 5000,那么 "langs + 1" 将指向地址 5004,该地址存储了指向第二个字符串的指针。
因此,我们也可以使用以下循环变体来打印字符串数组 -
for(int i = 0; i < 10; i++){ printf("%s ", *(langs + i)); }
将字符串存储在数组中时,有很多用例。让我们来研究一下其中的一些用例。
查找长度最大的字符串
在下面的示例中,我们将第一个字符串的长度及其位置(即"0")分别存储在变量"l"和"p"中。在for循环中,每当找到长度更大的字符串时,我们都会更新这些变量。
示例
请看以下示例 -
#include <stdio.h> #include <string.h> int main (){ char langs [10][15] = { "PYTHON", "JAVASCRIPT", "PHP", "NODE JS", "HTML", "KOTLIN", "C++", "REACT JS", "RUST", "VBSCRIPT" }; int l = strlen(langs[0]); int p = 0; for (int i = 0; i < 10; i++){ if (strlen(langs[i]) >= l){ l = strlen(langs[i]); p = i; } } printf("Language with the longest name: %s Length: %d", langs[p], l); return 0; }
输出
运行此代码时,将产生以下输出 -
Language with longest name: JAVASCRIPT Length: 10
按升序对字符串数组进行排序
我们需要使用 strcmp() 函数 来比较两个字符串。如果比较结果大于 0,则表示第一个参数字符串按字母顺序出现在第二个参数字符串之后。然后,我们使用 strcmp() 函数交换这两个字符串。
示例
请看以下示例 -
#include <stdio.h> #include <string.h> int main (){ char langs [10][15] = { "PYTHON", "JAVASCRIPT", "PHP", "NODE JS", "HTML", "KOTLIN", "C++", "REACT JS", "RUST", "VBSCRIPT" }; int i, j; char temp[15]; for (i = 0; i < 9; i++){ for (j = i + 1; j < 10; j++){ if (strcmp(langs[i], langs[j]) > 0){ strcpy(temp, langs[i]); strcpy(langs[i], langs[j]); strcpy(langs[j], temp); } } } for (i = 0; i < 10; i++){ printf("%s ", langs[i]); } return 0; }
输出
运行此代码时,将产生以下输出 -
C++ HTML JAVASCRIPT KOTLIN NODE JS PHP PYTHON REACT JS RUST VBSCRIPT
在本章中,我们解释了如何声明一个字符串数组以及如何借助字符串函数对其进行操作。