C 言語での文字列の配列
![C 言語での文字列の配列](/img/C/feature-image---array-of-strings-in-c.webp)
この記事では、C 言語で文字列の配列を宣言する方法について、複数の方法を紹介します。
2 次元配列記法を使って C 言語で文字列の配列を宣言する
C 言語における文字列は、連続したメモリ領域に格納された chars
のシーケンスです。文字列との違いの一つは、文字列の最後にヌルバイト 0
が格納されており、これが一つの文字列の終わりを示すことです。もし、[]
記法を用いて char
の固定配列を宣言すれば、同じ数の文字からなる文字列をその場所に格納できます。
文字列を配列の位置にコピーする際には、終端のヌルバイトのために 1 文字分の余分なスペースを考慮しなければならないことに注意してください。このようにして、括弧表記で 2 次元の char
配列を宣言し、それを文字列の配列として利用することができます。配列の 2 次元目は文字列の最大長を制限します。この場合、マクロ定数 MAX_LENGTH
を任意に定義します。配列全体を {""}
記法で初期化することができます。初期化済みの配列に文字列の値を格納する場合は、代入演算子は使えないので、strcpy
のように特殊なメモリコピー関数を利用する必要があります。
#include <stdio.h>
#include <stdlib.h>
#include <string.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
あるいは、宣言されたときに 2 次元の char
配列を即座に初期化することもできます。最近の C11 標準では、char
配列を文字列リテラルで初期化することができ、配列の長さが文字列そのものよりも大きい場合には、文字列の末尾にヌルバイトを自動的に格納することさえできます。初期化リストの表記法は C++ の構文に似ています。中括弧付きの要素はそれぞれ長さ MAX_LENGTH
の連続したメモリ領域に格納されることになっています。初期化リストの記法で配列サイズより少ない要素を指定した場合、残りの要素は暗黙的に \0
バイトで初期化されています。
#include <stdio.h>
#include <stdlib.h>
#include <string.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 <stdio.h>
#include <stdlib.h>
#include <string.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 <stdio.h>
#include <stdlib.h>
#include <string.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),