C 言語で文字列配列の長さを取得
この記事では、C 言語で char
配列の長さを取得するいくつかの方法を説明します。
sizeof
演算子を使って char 配列の長さを求める
配列のサイズは要素のデータ型に関係なく sizeof
演算子を用いて計算することができます。しかし、配列のサイズを計測する際に、内部の詳細を無視してしまうと恐ろしいエラーが発生する可能性があります。
すなわち、次の例では、arr
と arr2
という名前の 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
を呼び出すと、arr
と arr2
の両方を繰り返し処理することになり、最初の配列はヌルバイトで終了しておらず、コンパイラは 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