連載
【問題16】配列で処理をシンプルにする:完全マスター! 組み込みC言語プログラミング(18)(2/2 ページ)
何らかの数値を読み取って、それに対応する文字列を表示するプログラムは、「switch」を使うやり方を紹介しまたが、文字列の配列(char型の配列)で記述することもできます。
ポインタの配列による文字列の配列
文字列の配列は、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の配列です。図示すると次のようになります。
ここで黄色の箱がmonthで、monthには文字列リテラル(緑の箱)へのポインタが格納されます。文字列リテラルとは、ダブルコーテーション(”)で囲まれた文字定数のことで、静的記憶域期間を持ちます。
月に対応する英語を求めるのはmonth.cと変わりません。13行目のprintf("英語では、%sです\n", month[m - 1]);で、monthはchar*の配列ですから、月であるmから1引いた値を添字に指定すればよいのです。
問題17
それでは、次回の宿題です。
問題17:
C言語のソースプログラムを読み取り、その中に単語がいくつあるか表示します。ただし単語とは、先頭の文字がアルファベットまたはアンダースコア(_)で、2文字目以降の文字がアルファベットまたはアンダースコアまたは数字とします。ダブルコーテーション(”)で囲まれた文字列リテラルやコメントは単語に含みません。⇒解答と解説は次回
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- 【問題15 その2】再帰を実現するコンピュータの仕組み
C言語のプログラムにおいて、関数が関数内で自分自身を呼び出すことを「再帰」と呼び、whileやforを使わなくても繰り返しのプログラムを書くことができます。再帰を実現するコンピュータの仕組みとともに身につけましょう。 - 【問題15】変数を制する者は関数を制する
C言語において変数とはある値を記録して出力する機能を指しますが、「外部変数」と「再帰」の理解を深めることで、関数をより自在に扱えるようになります。 - 【問題14】ポインタなしで関数は語れない
C言語においてポインタは「何か(オブジェクト)を指すもの」ですが、単純に何かを指すだけではなく、関数内のオブジェクトを参照することもできます。ポインタなしに関数は語れないという実例を確認してみましょう。