在 C 語言中初始化字元陣列
Jinku Hu
2023年10月12日
本文將演示如何在 C 語言中初始化一個字元陣列的多種方法。
使用 {}
捲曲括號列表符號在 C 語言中初始化一個字元陣列
字元陣列大多被宣告為一個固定大小的結構,並經常被立即初始化。大括號列表符號是用常量值初始化字元陣列的可用方法之一。可以只指定大括號中的部分元素,因為字元陣列的剩餘部分被隱式地用空位元組值初始化。如果需要將字元陣列列印成字串,這就很有用。由於保證在有效字元的末尾有一個空位元組字元,那麼可以有效地利用 printf
函式和%s
格式字串指定符來輸出陣列的內容。
#include <stdio.h>
#include <stdlib.h>
#include <string.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 <stdio.h>
#include <stdlib.h>
#include <string.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 <stdio.h>
#include <stdlib.h>
#include <string.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, .,
作者: Jinku Hu