C 言語で文字列配列の長さを取得

胡金庫 2023年10月12日
  1. sizeof 演算子を使って char 配列の長さを求める
  2. strlen 関数を用いて文字列配列の長さを求める
C 言語で文字列配列の長さを取得

この記事では、C 言語で char 配列の長さを取得するいくつかの方法を説明します。

sizeof 演算子を使って char 配列の長さを求める

配列のサイズは要素のデータ型に関係なく sizeof 演算子を用いて計算することができます。しかし、配列のサイズを計測する際に、内部の詳細を無視してしまうと恐ろしいエラーが発生する可能性があります。

すなわち、次の例では、arrarr2 という名前の 2つの配列を異なる記法で初期化しています。そして、sizeof 演算子を用いて両方の配列のサイズを取得し、コンソールに出力します。

出力される要素が 17 個しかないにもかかわらず、2 番目の配列のサイズは 18 バイトになっていることに注意してください。この問題の原因は初期化の方法に隠されています。すなわち、char 配列を文字列リテラル値で初期化した場合、終端のヌルバイトも配列の一部として格納されます。そのため、sizeof 演算子はこのバイトを全要素の和に含めて対応する結果を返します。

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

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

int main(int argc, char *argv[]) {
  char arr[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g'};
  char arr2[] = "array initialized";

  printCharArray(arr, sizeof arr);
  printf("size = %lu bytes \n", sizeof arr);

  printf("\n");

  printCharArray(arr2, sizeof arr2 - 1);
  printf("size = %lu bytes \n", sizeof arr2);

  exit(EXIT_SUCCESS);
}

出力:

a, b, c, d, e, f, g,
size = 7 bytes
size = 24 bytes

a, r, r, a, y,  , i, n, i, t, i, a, l, i, z, e, d,
size = 18 bytes
size = 17 bytes

strlen 関数を用いて文字列配列の長さを求める

いくつかのシナリオでは、C 標準ライブラリの文字列ユーティリティの一部である strlen 関数を用いて、ヌル文字で終端する文字列として初期化または保存された char 配列のサイズを測定することができます。

先ほどのサンプルコードを strlen の計算値を用いて実行すると、別の問題によって異なる数値が得られます。まず、arr のオブジェクトサイズは 24 バイトと表示されますが、これは strlen 関数が終端のヌルバイトに遭遇するまで char 配列を繰り返し処理するためです。したがって、arr オブジェクトで strlen を呼び出すと、arrarr2 の両方を繰り返し処理することになり、最初の配列はヌルバイトで終了しておらず、コンパイラは arr2 をその後も継続して格納しているため、結果として両方の配列の合計から 1 を引いたサイズになります(ヌルバイトで終了する部分は破棄します)。

なお、私たちが実装した lengthOfArray 関数は strlen のカウント動作を真似ており、同じ数値が得られることに注意してください。2 番目の配列オブジェクト arr2 の場合、strlen は最後のヌルバイトを除いた文字数を返します。

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

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

long lengthOfArray(const char *arr) {
  long size = 0;

  while (*arr) {
    size += 1;
    arr += 1;
  }

  return size;
}

int main(int argc, char *argv[]) {
  char arr[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g'};
  char arr2[] = "array initialized";

  printCharArray(arr, sizeof arr);
  printf("size = %lu bytes \n", sizeof arr);
  printf("size = %lu bytes \n", strlen(arr));
  printf("size = %lu bytes \n", lengthOfArray(arr));

  printf("\n");

  printCharArray(arr2, sizeof arr2 - 1);
  printf("size = %lu bytes \n", sizeof arr2);
  printf("size = %lu bytes \n", strlen(arr2));
  printf("size = %lu bytes \n", lengthOfArray(arr2));

  exit(EXIT_SUCCESS);
}

出力:

a, b, c, d, e, f, g,
size = 7 bytes
size = 24 bytes
size = 24 bytes

a, r, r, a, y,  , i, n, i, t, i, a, l, i, z, e, d,
size = 18 bytes
size = 17 bytes
size = 17 bytes
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

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

LinkedIn Facebook

関連記事 - C Char