在 C 語言中初始化字元陣列

Jinku Hu 2023年1月30日 2021年2月7日
  1. 使用 {} 捲曲括號列表符號在 C 語言中初始化一個字元陣列
  2. 使用字串賦值來初始化 C 語言中的字元陣列
  3. 使用 {{ }} 雙大括號在 C 語言中初始化 2D 字元陣列
在 C 語言中初始化字元陣列

本文將演示如何在 C 語言中初始化一個字元陣列的多種方法。

使用 {} 捲曲括號列表符號在 C 語言中初始化一個字元陣列

字元陣列大多被宣告為一個固定大小的結構,並經常被立即初始化。大括號列表符號是用常量值初始化字元陣列的可用方法之一。可以只指定大括號中的部分元素,因為字元陣列的剩餘部分被隱式地用空位元組值初始化。如果需要將字元陣列列印成字串,這就很有用。由於保證在有效字元的末尾有一個空位元組字元,那麼可以有效地利用 printf 函式和%s 格式字串指定符來輸出陣列的內容。

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

void printCharArray(char *arr, size_t len)
{
    printf("arr: ");
    for (int i = 0; i < len; ++i) {
        printf("%c, ", arr[i]);
    }
    printf("\n");
}

enum {LENGTH = 21, HEIGHT = 5};

int main(){
    char c_arr[LENGTH] = {'a', 'b', 'c', 'd', 'e', 'f', 'g'};
    printCharArray(c_arr, LENGTH);

    exit(EXIT_SUCCESS);
}

輸出:

arr: a, b, c, d, e, f, g, , , , , , , , , , , , , , ,

使用字串賦值來初始化 C 語言中的字元陣列

另一種初始化字元陣列的有用方法是在宣告語句中指定一個字串值。字串的字元數應少於陣列的長度;否則,將只儲存字串的一部分,並且在緩衝區的最後沒有終止的空字元。因此,如果使用者試圖用%s 指定符來列印陣列的內容,它可能會訪問最後一個字元之後的記憶體區域,並可能會丟擲一個故障。

請注意,c_arr 的長度為 21 個字元,並且初始化為 20 個 char 長字串。因此,陣列中的第 21 個字元保證是\0 位元組,使內容成為一個有效的字串。

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

void printCharArray(char *arr, size_t len)
{
    printf("arr: ");
    for (size_t i = 0; i < len; ++i) {
        printf("%c, ", arr[i]);
    }
    printf("\n");
}

enum {LENGTH = 21, HEIGHT = 5};

int main(){
    char c_arr[LENGTH] = "array initialization";
    char c_arr2[LENGTH] = "array initialization.f";
    printCharArray(c_arr, LENGTH);
    printCharArray(c_arr2, LENGTH);
    printf("%s\n", c_arr);
    printf("%s\n", c_arr2);

    exit(EXIT_SUCCESS);
}

輸出:

arr: a, r, r, a, y,  , i, n, i, t, i, a, l, i, z, a, t, i, o, n,  ,
arr: a, r, r, a, y,  , i, n, i, t, i, a, l, i, z, a, t, i, o, n, .,
array initialization
array initialization.//garbage values//

使用 {{ }} 雙大括號在 C 語言中初始化 2D 字元陣列

大括號列表也可用於初始化二維字元陣列。在本例中,我們宣告一個 5x5 的字元陣列,並在外層大括號中包含五個大括號。請注意,本例中的每個字串文字都初始化了矩陣的五個元素行。這個二維陣列的內容不能用%s 指定符列印,因為每行的長度與字串字元的長度相匹配;因此,在初始化過程中,沒有隱含地儲存終止的空位元組。通常情況下,如果字串的長度大於陣列的行數,編譯器會發出警告。

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

enum {LENGTH = 5, HEIGHT = 5};

int main(){
    char c_arr[HEIGHT][HEIGHT] = { {"hello"}, {"there"}, {"multi"}, {"dimen"}, {"sion."} };

    for (size_t i = 0; i < HEIGHT; ++i) {
        for (size_t j = 0; j < HEIGHT; ++j) {
            printf("%c, ", c_arr[i][j]);
        }
        printf("\n");
    }
    printf("\n");

    exit(EXIT_SUCCESS);
}

輸出:

h, e, l, l, o,
t, h, e, r, e,
m, u, l, t, i,
d, i, m, e, n,
s, i, o, n, .,
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