C 言語で文字列配列を初期化する
-
C 言語で
char
配列を初期化するには、{}
中括弧付きリスト記法を使用する -
文字列代入を用いた C 言語の
char
配列の初期化 -
C 言語の 2 次元
char
配列の初期化に{{ }}
二重中括弧を使用する
この記事では、C 言語で char
配列を初期化する方法を複数紹介します。
C 言語で char
配列を初期化するには、{}
中括弧付きリスト記法を使用する
char
配列はほとんどの場合、固定サイズの構造体として宣言され、すぐに初期化されることが多いです。中括弧付きリスト記法は、char
配列を定数値で初期化するために利用可能な方法の一つです。char の残りの部分は暗黙のうちにヌルバイト値で初期化されるので、中括弧で囲まれた要素の一部だけを指定することも可能です。これは、配列 char
を文字列として出力する必要がある場合に便利です。有効な文字の末尾にはヌルバイト文字が保証されているので、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 言語の char
配列の初期化
char
配列を初期化するもう一つの便利な方法は、宣言文の中で文字列の値を代入することです。文字列リテラルは配列の長さよりも少ない文字数でなければなりません。そうでなければ、文字列の一部しか保存されず、バッファの最後には終端のヌル文字がありません。そのため、ユーザが %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 言語の 2 次元 char
配列の初期化に {{ }}
二重中括弧を使用する
中括弧付きリストは、2 次元の char
配列の初期化にも利用できます。この例では、5x5 の char
配列を宣言し、外側の中括弧の中に 5つの中括弧付き文字列を入れます。この例では、各文字列リテラルが行列の 5つの要素の行を初期化することに注意してください。各行の長さは文字列リテラルの長さと一致するため、この 2 次元配列の内容は %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, .,