「文字列データ」

文字列データ

C言語には基本データ型として文字列型というものは存在しない。 文字型データの配列を文字列として扱う。
ただし、そのままではどこまでが有効な文字列データなのかが判別できないので、 文字列の最後に必ず '\0' (NULL(ナル)文字)を置くことで 文字列の最後を示すことにしている。(C言語での約束事)

以下の例ではサイズが 5個分の char型の配列を確保し、"AbCd"という内容の文 字列データを格納している例である。 文字列の最後に必ず'\0'(NULL文字)を置く必要があるため、格納したい文字列 の文字数より1文字分多いサイズの配列を確保する必要がある。 この場合は、4文字の文字列を格納するために、5個分の配列を格納している。

char string[5];      /* 文字型の配列 (長さ5) */

string[0] = 'A';
string[1] = 'b';
string[2] = 'C';
string[3] = 'd';
string[4] = '\0';    /* NULL文字で終端 */

メモリ上での文字列データの図

配列の1つ1つに文字データを格納していく方法でも文字列データを格納できる が、通常は以下のようにもっと簡単に文字列データを格納する方法を使う。

char string[] = "AbCd";    /* 長さは自動的に計算される */
ここで、"AbCd"は文字列定数(または文字列リテラル)と呼ぶ。 文字列定数は「"」 (ダブルクォート)で文字列を囲むことで表現する。

注意:  文字定数の「'」(シングルクォート)と間違えないように注意すること。

上記のように記述することで、コンパイラが自動的に文字列の長さを計算し、 必要なサイズの配列を確保して文字列を格納してくれる。

以下のように明示的に配列の長さを指定することもできる。

char string[5] = "AbCd";
ただしこの場合、以下のように配列の長さを間違えると格納したい文字列の一部しか格納されず、 文字列終端の印である '\0' (NULL文字)が格納されないため、 プログラムの不具合の原因となることもあるので、注意が必要である。。
格納する文字列の長さよりも長い場合には余分な配列領域が確保されるだけで 格納したい文字列は全て格納される。
char string[3] = "AbCd";    /* 配列の長さが足りない場合 */

また、以下は空の文字列データの例である。 この例のように何も文字列がない場合でも'\0'を格納するために長さが 1の配列が 確保される。

char string[] = "";         /* NULL文字だけの文字列データ */

NULL文字だけの文字列データの図

以下の サンプルコードは文字列の長さを調べ、 文字列中のアルファベット文字を全て大文字にするプログラムである。
(小文字から大文字への変換には文字型データ操作ライブラリ関数の一つである toupper() を使用している)

#include <ctype.h>
#include <stdio.h>

/* 文字列の長さを調べる */
int
string_length(char str[])
{
    int len = 0;

    /* 文字型の配列 strの先頭から1個ずつ調べていき
       '\0'が見付かった時点でループを抜ける */
    while (str[len] != '\0')
	len++;

    return len;
}

/* 文字列中のアルファベットを全て大文字にする */
void
string_toupper(char dst[], char src[])
{
    int i = 0;

    /* 文字型の配列 strの先頭から1個ずつ大文字にしていく
       '\0'が見付かった時点でループを抜ける */
    while (src[i] != '\0') {
	dst[i] = toupper(src[i]);
	i++;
    }

    /* 最後に '\0'を追加して文字列のおわりの印をつける */
    dst[i] = '\0';
}

void
check_string(char str[])
{
    char tmpbuf[256];

    printf("check '%s'\n", str);
    printf("length is %d\n", string_length(str));

    string_toupper(tmpbuf, str);

    /* printf()での書式指定子には %sを使う(文字型の場合は %c) */
    printf("%s\n", tmpbuf);

    printf("\n");
}

int
main(void)
{
    check_string("A quick brown fox jumps over the lazy dog.");

    return 0;
}

実行結果は以下のようになる。

check 'A quick brown fox jumps over the lazy dog.'
length is 42
A QUICK BROWN FOX JUMPS OVER THE LAZY DOG.



文責:石川