C 言語での文字列の配列

胡金庫 2023年10月12日
  1. 2 次元配列記法を使って C 言語で文字列の配列を宣言する
  2. C 言語で文字列の配列を宣言するには char* 配列記法を使用する
C 言語での文字列の配列

この記事では、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),
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C Array

関連記事 - C String