第7回

char型の配列とヌル文字(int型の配列も)

00/06/27 解説文の一部訂正
00/06/26 サンプルプログラム、解説文の一部訂正
文字列終端にヌルがあることを確認するプログラムを追加
99/06/29 誤字脱字を訂正
98/11/06 IE4.xに対応させた
98/04/29メールアドレス訂正

文字列型(char *)を理解する為には、char型の配列というものを学んでおく必要があります。
まずは、char型の配列の宣言は、以下のように行います。

char a[5];
char型の配列は、char型変数の集合体です。上記の宣言によって、a[0]、a[1]、a[2]、a[3]、a[4]の5つのchar型変数が宣言されたことになります(a[0]から始まることに注意)。 で、このchar型の配列を利用する事によって、文字列を取り扱う事ができます。例えば、さっき宣言したchar型配列aを使って文字列"abcd"を格納してみます(格納といいましたが、実際にはこれもメモリ上のどこかのアドレスに・・・ってことを覚えておいて下さい)。

a[0]='a';
a[1]='b';
a[2]='c';
a[3]='d';
a[4]='\0';
とまぁ、こんな感じです。a[4]に入った'\0'は、ヌル文字と呼ばれる制御文字(文字といっても見えませんが)です。ヌル文字は文字列の終端を示すもので、文字列の最後に必ず無ければならないものです。例えば、コンピュータが文字列をprintf関数等で出力する際、'\0'が見付かるまで文字を出力することで文字列というものを出力している訳です。つまり、ヌルが無いと、コンピュータはどこまでが文字列なのか判断できなくなってしまいます

また、"abcd"をchar型配列に入れる際、最後にヌル文字(\0)を入れる為に、1文字分多い5つの配列が必要となりました。同様に文字列"iizaka"をchar型配列で取り扱う場合は、6文字+ヌル(1文字)、つまり7個の配列(a[0]からa[6])を宣言しなければならないということになります。あと、

char a[5];
a="abcd";
といったことは出来ません(char型配列の宣言と共に初期化する場合、それと近い方法がありますが・・・)。 それと、printf関数等を使ってchar配列aを出力する場合は、
printf("%s\n",a);
として下さい。まぁ、配列の中から1文字分(例えば2文字目)を取り出す場合は、
printf("%c\n",a[1]);
となります。

それと、宣言時に初期化を行うのであれば、もうちょっと簡単に文字列を配列に代入できます。こんな感じです。

char a[]={'a','b','c','d','\0'};
[]の中に最大入力文字数が指定されていないことに注目して下さい。さらに、さっきの誤ったプログラム風に初期化することも可能です。

char a[]="abcd";
もちろんこれでa[4]に'\0'が代入されます。また、こういった宣言時の初期化は、他のデータ型配列でも行うことができます。例えば(int型配列)・・・

#include<stdio.h>
main(){
    int a[5];

    a[0]=1,a[1]=2,a[2]=3,a[3]=4,a[4]=5;
    printf("a[0]=%d\n",a[0]);
    printf("a[1]=%d\n",a[1]);
    printf("a[2]=%d\n",a[2]);
    printf("a[3]=%d\n",a[3]);
    printf("a[4]=%d\n",a[4]);
}
を、配列の宣言時に初期化を行ってみると、

#include<stdio.h>
main(){
    int a[]={1,2,3,4,5};

    printf("a[0]=%d\n",a[0]);
    printf("a[1]=%d\n",a[1]);
    printf("a[2]=%d\n",a[2]);
    printf("a[3]=%d\n",a[3]);
    printf("a[4]=%d\n",a[4]);
} 
といった感じになります。ちなみに、printfの部分をforを使って、
    int i,a[]={1,2,3,4,5};

    for(i=0;i<5;i++)printf("a[%d]=%d\n",i,a[i]);
といった具合に、スマートにする事ができるのですが、それについてはまたの機会に・・・。

つづく。


[メニュー][第6回][第8回]

・文字列の終端にヌル文字があることを実際に確認してみたい時は、こんなプログラムはいかがでしょうか?

いーざ
email:CQP00202@nifty.ne.jp