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

在本章中,我們解釋瞭如何宣告字串陣列以及如何在字串函式的幫助下操作它。

廣告