配列について

最終更新日:2004-06-15.

今回は、配列についてちょっと。
文字列を処理する場合、文字型配列を使います。
また、この配列は整数、実数、ポインタなど他の変数の場合でも
使用できます。
例えば。
char c;
c='A';
上記は、文字型変数cを宣言して、そこに値Aを代入しています。
これは半角文字1文字を処理できます。
char word[128]="ABC";
上記は、文字型配列wordを宣言して、そこに文字列ABCを代入しています。
その際、wordの大きさを128バイトとしています。
この文字型配列wordに代入できる文字列の長さは半角文字で127文字です。
それは、文字列の終わりにはNULL文字'\0'が代入されるからです。
char word2[]="JAPAN";
このように配列の長さを指定しないと、代入する文字列の長さ
(プラスNULL文字分1文字)が指定されます。
上記は、JAPANの5文字プラス1の6が指定されます。
この配列は、整数、実数、ポインタなどでも使用できます。
同じ型の変数をいくつも宣言して使用するような場合、
配列を使うと便利です。
・数値配列。
配列を使用すると、同じデータ型で同じ変数名の複数のデータが
使用できます。
例えば、以下のように。
int num[10];
上記は、int型でnumという名前の変数を10個宣言しました。
実際には、
num[0]
num[1]
num[2]
num[3]
num[4]
num[5]
num[6]
num[7]
num[8]
num[9]
の10個です。
int num[10];
の10は要素数、
num[0]
のような各変数の番号は要素番号といいます。
これは1次元配列です。
その他にも、2次元、3次元配列なども使用できます。
int num[2][3];
上記では、
num[0][0]
num[0][1]
num[0][2]
num[1][0]
num[1][1]
num[1][2]
の6個の変数が使用できます。
・文字配列。
文字列を扱うには、文字配列を使用します。
char word[10];
上記は、word[0]からword[9]までの合計10個の変数が使用できます。
例えば、ここには「program」という文字列が代入できます。
また、全角文字は1文字が2バイトなので、全角文字を代入する際には
ちょっと注意が必要です。
文字配列に文字列を代入する際は、文字列の最後を表すぬる文字
(0x00)の分も含めて配列に収まるようにします。
「program」という文字列を代入するには、ぬるもじの分も考えて、
少なくとも8個分の領域が必要です。
また、複数の文字列を記憶する場合、2次元の文字型配列を使用するのも
良いでしょう。

では、それらをソースで見てみましょう。
+------------------------------------------------------------+
/* filename=no010-1.c */
/* include */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* main */
int main( )
{
int len;
char *p;
/* 1次元配列 */
char word[128];
/* 2次元配列 */
char week[8][11];
/* 文字列のコピー */
strcpy(word, "JAPAN");
len=strlen(word);
printf("word=%s wordsize=%d memorysize=%d\n", word, len, sizeof(word));
/* 文字列のコピー */
strcpy(&week[0][0], "SUNDAY");
strcpy(&week[1][0], "MONDAY");
strcpy(&week[2][0], "TUESDAY");
strcpy(&week[3][0], "WEDNESDAY");
strcpy(&week[4][0], "THURSDAY");
strcpy(&week[5][0], "FRIDAY");
strcpy(&week[6][0], "SATURDAY");
week[7][0]='\0';
/* 文字列をポインタで */
p=&week[0][0];
while( *p ){
len=strlen(p);
printf("word=%s wordsize=%d\n", p, len);
p+=11;
}
return 0;/* 終了 */
}
+------------------------------------------------------------+

上記のソースをコンパイルして実行すると以下のように表示されました。
word=JAPAN wordsize=5 memorysize=128
word=SUNDAY wordsize=6
word=MONDAY wordsize=6
word=TUESDAY wordsize=7
word=WEDNESDAY wordsize=9
word=THURSDAY wordsize=8
word=FRIDAY wordsize=6
word=SATURDAY wordsize=8

では、文字列を2次元配列にコピーするようなものを
ちょっと作ってみましょう。
+------------------------------------------------------------+
/* filename=no010-2.c */
/* include */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* 関数プロトタイプ宣言 */
void strcpy_h(char *s, char *t, int size, int num);
/* main */
int main( )
{
/* 2次元配列に関する設定 */
int size=11;
int num=8;
/* 2次元配列 */
char week[8][11];
char *p=&week[0][0];
/* 文字列のコピー */
strcpy_h(p,
"SUNDAY,MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,",
size, num);
while( *p ){
printf("%s\n", p);
p+=size;
}
return 0;/* 終了 */
}
void strcpy_h(char *s, char *t, int size, int num)
{
int i;
char *p;
while( 1 ){
/* セパレータの位置 */
p=strchr(t, ',');
/* 文字列の長さ */
if( p!=(char *)NULL )
i=p-t;
else
i=strlen(t);
/* 文字列のコピー */
strncpy(s, t, i);
*(s+i)='\0';
/* 次の文字列へ */
t+=i;
if( (*t)==',' )
t++;
/* 文字列の数 */
num--;
if( num==0 )
break;
/* メモリを進める */
s+=size;
}
return;/* 戻る */
}
+------------------------------------------------------------+

上記のソースをコンパイルして実行すると以下のように表示されました。
SUNDAY
MONDAY
TUESDAY
WEDNESDAY
THURSDAY
FRIDAY
SATURDAY

戻る