C 語言中的字串陣列

Jinku Hu 2023年1月30日 2021年2月7日
  1. 使用二維陣列符號在 C 語言中宣告字串陣列
  2. 在 C 語言中使用 char*陣列符號來宣告字串陣列
C 語言中的字串陣列

本文將演示關於如何在 C 語言中宣告一個字串陣列的多種方法。

使用二維陣列符號在 C 語言中宣告字串陣列

C 語言中的字串只是儲存在連續記憶體區域中的字元序列。關於字串的一個區別是,在序列的最後儲存了一個終止的空位元組/0,表示一個字串的結束。如果我們用 [] 符號宣告一個固定的 char 陣列,那麼我們就可以在該位置儲存一個由相同數量的字元組成的字串。

需要注意的是,在將字元字串複製到陣列位置時,應該考慮多出一個終止空位元組的字元空間。因此,可以用括號符號宣告一個二維的 char 陣列,並利用它作為字串的陣列。陣列的二維將限制字串的最大長度。在這種情況下,我們任意定義一個巨集常量-MAX_LENGTH 等於 100 個字元。整個陣列可以用 {""} 符號初始化,將陣列中的每個 char 元素清零。當在已經初始化的陣列中儲存字串值時,不允許使用賦值運算子,應使用特殊的記憶體複製函式,如 strcpy

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

#define MAX_LENGTH 100
#define NUM_STRINGS 10

int main(){

    char arr[NUM_STRINGS][MAX_LENGTH] = {""};

    arr2[0] = "string literal"; // Not permitted
    strcpy(arr[0], "hello world");
    printf("%s\n", arr[0]);
    printf("%s\n", strcpy(arr[0], "hello world"));

    exit(EXIT_SUCCESS);
}

輸出:

hello world
hello world

另外,我們也可以在宣告二維字元陣列時立即初始化。現代 C11 標準允許用字串字元初始化 char 陣列,甚至當陣列長度大於字串本身時,可以自動在字串末尾儲存空位元組。初始化列表的符號與 C++ 語法類似。每一個大括號的元素都應該儲存在一個長度為 MAX_LENGTH 的連續記憶體區域。如果初始化器符號指定的元素少於陣列大小,那麼剩餘的元素將被隱式初始化為\0 位元組。

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

#define MAX_LENGTH 100
#define NUM_STRINGS 10

int main(){
    char arr2[NUM_STRINGS][MAX_LENGTH] = { {"first string"},
                                          {"second string"},
                                          {"third string"},
                                          {"fourth string"},
                                          {"fifth string"} };

    for (int i = 0; i < NUM_STRINGS; ++i) {
        printf("%s, ", arr2[i]);
    }

    exit(EXIT_SUCCESS);
}

輸出:

first string, second string, third string, fourth string, fifth string, , , , , ,

在 C 語言中使用 char*陣列符號來宣告字串陣列

char*是通常用於儲存字串的型別。宣告 char*的陣列,我們就可以得到固定數量的指標,指向相同數量的字串。它可以用字串字元初始化,如下面的例子所示,也可以使用頭 <string.h> 中提供的特殊函式分配或複製。

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

#define MAX_LENGTH 100
#define NUM_STRINGS 10

int main(){
    char *arr3[NUM_STRINGS] = { "first string",
                                "second string",
                                "third string",
                                "fourth string",
                                "fifth string" };
    char* str1 = "string literal";
    arr3[8] = str1;
    arr3[9] = "hello there";

    for (int i = 0; i < NUM_STRINGS; ++i) {
        printf("%s, ", arr3[i]);
    }
    printf("\n");

    exit(EXIT_SUCCESS);
}

輸出:

first string, second string, third string, fourth string, fifth string, (null), (null), (null), string literal, hello there,

另一種選擇是,我們可以只指定 {} 括號,這將使陣列中的指標初始化為 null,它們可以在以後用於儲存其他字串地址,或者程式設計師甚至可以分配動態記憶體。

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

#define NUM_STRINGS 10

int main(){
    char *arr4[NUM_STRINGS] = {};
    for (int i = 0; i < NUM_STRINGS; ++i) {
        printf("%s, ", arr4[i]);
    }
    printf("\n");

    exit(EXIT_SUCCESS);
}

輸出:

(null), (null), (null), (null), (null), (null), (null), (null), (null), (null),
Author: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn

相關文章 - C Array

相關文章 - C String