Cprogramming 简明教程

Array of Strings in C

在 C 编程语言中, string 是以 NULL 结尾的一系列字符序列,它是单维字符数组。而字符串数组是字符串(字符数组)的数组。

What is an Array of Strings in C?

因此,可以将字符串数组定义为 -

为了声明一个字符串,我们使用语句 -

char string[] = {'H', 'e', 'l', 'l', 'o', '\0'};
Or
char string = "Hello";

Declare and Initialize an Array of Strings

要声明一个字符串数组,你需要声明一个字符类型的 two-dimensional array ,其中第一个下标是字符串的总数,第二个下标是每个字符串的最大大小。

要初始化一个字符串数组,你需要在双引号内提供多个字符串,并用逗号分隔。

Syntax

要构造一个字符串数组,使用以下语法 -

char strings [no_of_strings] [max_size_of_each_string];

Example

让我们声明和初始化一个字符串数组来存储 10 种计算机语言的名称,每种语言的最大长度为 15 个字符。

char langs [10][15] = {
   "PYTHON", "JAVASCRIPT", "PHP",
   "NODE JS", "HTML", "KOTLIN", "C++",
   "REACT JS", "RUST", "VBSCRIPT"
};

Printing An Array of Strings

可以使用 printf() function%s 格式说明符打印字符串。要打印字符串数组中的每个字符串,你可以使用 for loop 直到字符串的末尾。

Example

在下面的示例中,我们声明、初始化并打印了一个字符串数组 -

#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\n", langs[i]);
   }

   return 0;
}

当你运行这段代码时,它将产生以下输出:

PYTHON
JAVASCRIPT
PHP
NODE JS
HTML
KOTLIN
C++
REACT JS
RUST
VBSCRIPT

Note: 每个字符串的大小不等于数组声明中的行大小。\0 符号表示字符串的结束,并且行中剩余的单元格是空的。因此,分配给数组的内存的大部分未被利用,从而造成浪费。

How an Array of Strings is Stored in Memory?

我们知道,每个 char 类型在内存中占用 1 个字节。因此,将为此数组分配 150 字节的块。虽然此块是连续的内存位置,但 15 个字节的每组构成了一个行。

假设数组位于内存地址 1000,则该数组的逻辑布局可以显示在下图中 -

situated memory address

An Array of Strings with Pointers

为了更有效地使用内存,我们可以使用 pointers 。我们声明一个 1D 的“char *”类型数组,而不是一个 2D 的字符数组。

char *langs[10] = {
   "PYTHON", "JAVASCRIPT", "PHP",
   "NODE JS", "HTML", "KOTLIN", "C++",
   "REACT JS", "RUST", "VBSCRIPT"
};

在 2D 字符数组中,字符串占据 150 个字节。与此相反,在 array of pointers 中,字符串占据的字节数要少得多,因为每个字符串都随机分配了内存,如下所示 -

randomly allocated memory

Note: 这里, lang[ ] 是各个字符串的指针数组。

array of pointers

Example

我们可以使用 for loop 如下打印字符串数组 -

#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\n", 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\n", *(langs + i));
}

当字符串在数组中存储时,有很多用例。我们来研究一些用例。

Find the String with the Largest Length

在下面的示例中,我们分别将第一个字符串的长度及其位置(为“0”)存储在 variables “l”和“p”中。在 for 循环中,每当找到更大长度的字符串时,我们都会更新这些变量。

Example

请看以下示例:

#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

Sort a String Array in Ascending Order

我们需要使用 strcmp() function 来比较两个字符串。如果将字符串比较的值大于 0,则表示第一个参数字符串按字母顺序出现在第二个字符串之后。然后,我们使用 strcmp() 函数交换这两个字符串。

Example

请看以下示例:

#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\n", langs[i]);
   }

   return 0;
}

当你运行这段代码时,它将产生以下输出:

C++
HTML
JAVASCRIPT
KOTLIN
NODE JS
PHP
PYTHON
REACT JS
RUST
VBSCRIPT

在本章中,我们解释了如何声明字符串数组以及如何使用 string functions 对其进行操作。