文字列の配列は、charへのポインタの配列としても表すことができます。次のmonth2.cは、month.cと全く同じ動作をしますが、変数宣言を変更したためメモリのレイアウトがmonth.cとは異なります。
#include <stdio.h> void main(void) { char *month[12] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"}; int m; printf("月を入力してください->"); scanf("%d", &m); if (m >= 1 && m <= 12) printf(英語では、"%s です¥n", month[m - 1]); else printf("1から12までの数で入力してください¥n"); }
ここで文字列の並びは、charへのポインタの配列として宣言します。
5行目の
char *month[12] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};
で、monthは要素型がchar*で、大きさが12の配列です。図示すると次のようになります。
ここで黄色の箱がmonthで、monthには文字列リテラル(緑の箱)へのポインタが格納されます。文字列リテラルとは、ダブルコーテーション(”)で囲まれた文字定数のことで、静的記憶域期間を持ちます。
月に対応する英語を求めるのはmonth.cと変わりません。13行目のprintf("英語では、%sです\n", month[m - 1]);で、monthはchar*の配列ですから、月であるmから1引いた値を添字に指定すればよいのです。
それでは、次回の宿題です。
C言語のソースプログラムを読み取り、その中に単語がいくつあるか表示します。ただし単語とは、先頭の文字がアルファベットまたはアンダースコア(_)で、2文字目以降の文字がアルファベットまたはアンダースコアまたは数字とします。ダブルコーテーション(”)で囲まれた文字列リテラルやコメントは単語に含みません。⇒解答と解説は次回
Copyright © ITmedia, Inc. All Rights Reserved.