連載
» 2015年02月13日 11時00分 公開

【問題16】配列で処理をシンプルにする完全マスター! 組み込みC言語プログラミング(18)(2/2 ページ)

[横田一弘 埼玉県立新座総合技術高等学校 教諭,MONOist]
前のページへ 1|2       

ポインタの配列による文字列の配列

 文字列の配列は、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");
}
month2.c

 ここで文字列の並びは、charへのポインタの配列として宣言します。

 5行目の

char  *month[12] = {
    "January", "February", "March", "April", "May", "June",
    "July", "August", "September", "October", "November", "December"};

 で、monthは要素型がchar*で、大きさが12の配列です。図示すると次のようになります。

photo

 ここで黄色の箱がmonthで、monthには文字列リテラル(緑の箱)へのポインタが格納されます。文字列リテラルとは、ダブルコーテーション()で囲まれた文字定数のことで、静的記憶域期間を持ちます。

 月に対応する英語を求めるのはmonth.cと変わりません。13行目のprintf("英語では、%sです\n", month[m - 1]);で、monthはchar*の配列ですから、月であるmから1引いた値を添字に指定すればよいのです。

問題17

 それでは、次回の宿題です。

問題17:

C言語のソースプログラムを読み取り、その中に単語がいくつあるか表示します。ただし単語とは、先頭の文字がアルファベットまたはアンダースコア(_)で、2文字目以降の文字がアルファベットまたはアンダースコアまたは数字とします。ダブルコーテーション(”)で囲まれた文字列リテラルやコメントは単語に含みません。⇒解答と解説は次回


お知らせ

photo 「CADLUS+Arduino電子工作ガイド」

本連載「完全マスター! 組み込みC言語プログラミング」も好評掲載中の横田氏による書籍「CADLUS+Arduino電子工作ガイド」(オーム社)が発売中です。

Arduinoと無料プリント基板CAD「CADLUS PCB」を組み合わせた電子工作の手法を示すもので、実際にサンプルを示しながら、プリント基板の設計、作成から組み立て、プログラムまでを手順を追って解説しています。



前のページへ 1|2       

Copyright © ITmedia, Inc. All Rights Reserved.