文字列の配列は、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文字目以降の文字がアルファベットまたはアンダースコアまたは数字とします。ダブルコーテーション(”)で囲まれた文字列リテラルやコメントは単語に含みません。⇒解答と解説は次回
 【問題15 その2】再帰を実現するコンピュータの仕組み
【問題15 その2】再帰を実現するコンピュータの仕組み 【問題15】変数を制する者は関数を制する
【問題15】変数を制する者は関数を制する 【問題14】ポインタなしで関数は語れない
【問題14】ポインタなしで関数は語れないCopyright © ITmedia, Inc. All Rights Reserved.
組み込み開発の記事ランキング
コーナーリンク