C语言中的字符串数组



在C编程语言中,字符串是由NULL终止的字符序列数组,它是一维字符数组。并且,字符串数组是字符串(字符数组)的数组。

什么是C语言中的字符串数组?

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

字符串数组是一个二维字符类型数组,其中每个字符数组(字符串)都以空字符结尾。

要声明一个字符串,我们使用以下语句 –

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

输出

运行此代码时,将产生以下输出 –

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

注意:每个字符串的大小不等于数组声明中的行大小。"\0"符号表示字符串的终止,并且行中剩余的单元格为空。因此,分配给数组的大部分内存未被使用,从而浪费了内存。

字符串数组如何在内存中存储?

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

假设数组位于内存地址1000,则此数组的逻辑布局可以如下所示 –

Situated Memory Address

使用指针的字符串数组

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

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

在二维字符数组中,字符串占用150个字节。与此相反,在指针数组中,字符串占用的字节数要少得多,因为每个字符串都随机分配了内存,如下所示 –

Randomly Allocated Memory

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

Array of Pointers

示例

我们可以使用如下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\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));
}

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

查找长度最大的字符串

在以下示例中,我们将第一个字符串的长度及其位置(即“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\n", langs[i]);
   }

   return 0;
}

输出

运行此代码时,将产生以下输出 –

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

在本章中,我们解释了如何声明字符串数组以及如何在字符串函数的帮助下操作它。

广告