文字列

文字列は文字(character)が並んだものを一つのまとまりとして表すのが文字列(string)です。
標準Cでは以下のように定義されています。
「最初のナル(null)文字で終わり、かつそれを含む連続した文字の並びを文字列という。」

文字列を使用した記述例

// string program in C.    
#include <stdio.h>  

int main(int argc, char *args[])
{   
    char a[4] = {'S', 'X', '\0', '2'};
    char b[4] = "あC";

    printf("a = %s\n", a);  
    printf("b = %s\n", b);  

    return 0;
}
  1. 配列「a」の要素は、先頭から順に 'S', 'X', '\0', '2' で初期化されます。
    3 番目の要素 a[2] がnull文字である為、それを含めた配列「a」の先頭 3 文字が文字列"SX"とみなされます。
  2. 配列「b」の宣言は、次のように解釈されます。
    char b[4] = {0x82, 0xa0, 'C', '\n'};
    ↑ null文字が自動的に付加されます。
    先頭要素から順に 0x82, 0xa0, 'C', '\n' で初期化されます。
    (「あ」ShiftJISの16進表記で「0x82a0」)

実行結果

a = SX
b = あC

上記記述例では、printf関数を使用して文字列を表示しています。
この第1パラメータは変換書式指定であり、「%s」を指定することでnull文字の直前までの全文字が表示されます。


ヌル終端文字列

ヌル(ナル)終端文字列(ヌルしゅうたんもじれつ、英語: null-terminated string)は、 文字列(文字の配列)としての終わり(その終端)を表した文字列のことです。


文字列を使用した記述例(終端null)

例として、以下のように変数「str」の初期値として "ABC\0DEF" を格納した場合、 'A', 'B', 'C', '\n', 'D', 'E', 'F' と終端nullの '\n' が格納され、配列としての全体サイズは 8 byteになります。
※ 初期化しの個数(サイズ)から配列の要素数が決定される為、要素数は省略可能です。

// string program in C.    
#include <stdio.h>  

int main(int argc, char *args[])
{   
    char str[]  = "あC";

    printf("str = %s\n", b);  

    return 0;
}

実行結果

str = ABC

上記例で初期化した変数「str」をprintf関数を使用して文字列を表示した場合、最初にnull文字が出現する直前までが出力される為、"ABC"のみが表示されます。


文字列を使用した記述例

また、以下のように配列の要素数と初期化子に同じサイズを指定した場合、末尾にnull文字は付加されません。
したがって、以下の二つの宣言は同一となります。
※ ただし、C++では配列の要素数とnull文字を含まない文字列数が等しい場合、エラーとなります。

// string program in C.    
#include <stdio.h>  

int main(int argc, char *args[])
{   
    char a[3] = {'A', 'B', 'C'};
    char b[3] = "ABC";

    printf("a = %s\n", a);  
    printf("b = %s\n", b);  

    return 0;
}

実行結果

a = ABCフフフフフホ犀ッ/・・
b = ABCフフフフフフフフフABCフフフフフホ犀ッ/・・

上記例は終末文字がnullでない為、文字列ではなく、単なる文字の集合となります。
その為、上記実行結果のようにnull ※ 上記プログラムを正常にコンパイルできない処理系は、標準Cに準拠していないことになります。


上記のような文字の集合をprintf()を使用して正常に出力する場合、書式で出力する範囲を絞る必要があります。

// string program in C.    
#include <stdio.h>  

int main(int argc, char *args[])
{   
    char a[3] = {'A', 'B', 'C'};
    char b[3] = "ABC";

    printf("a = %s.3\n", a);  
    printf("b = %s.3\n", b);  
    
    return 0;
}

実行結果

a = ABCフフフフフホ犀ッ/・・
b = ABCフフフフフフフフフABCフフフフフホ犀ッ/・・

Last updated:2018/08/16
Author:efn

';