第2章04 char型変数を使って1文字表示して計算する@イチからゲーム作りで覚えるC言語

イチからゲーム作りで覚えるC言語
連載ページ一覧へ
2章05 文字列変数の宣言、初期化と表示
NEXT : 2章05 文字列変数の宣言、初期化と表示
2章03 変数を使ったレベルや体力など表示する : PREV

この記事でやること

前回はプロジェクト「0020_keisan」のソースコードを使って、int型とfloat型の変数の宣言や初期化の方法、足し算を計算するプログラムを書きました。
今回は、別の代表的な変数である char 型についてみていきましょう。どちらの変数もゲーム制作に限らずどんなプログラムを組んでも頻繁にお世話になるかと思います。
bool 型は後ほど条件文をお話しした後に書きますので、ここでは放置しておきたいです。
この記事は前回のつづきですので、前回を読んでる前提で書いてます。

この記事はゆる~くC言語でゲームを作りながらプログラミングを学ぶための連載記事です。シリーズものですので記事の一覧はこちらを参照してくださいね。

新しい char 型変数を使ったプログラム

ではでは char 型を取り扱うサンプルプログラムを作成してみましょう。
プロジェクト「0030_moji」を新しく用意し、プロジェクトに空の「Moji.c」を追加し、下のソースコードをコピペして動かしてみましょう。

#include <stdio.h>;
int main( void )
{
 char lunch = 'A';
 printf("ぷらんく:お金がないのでお昼は %c ランチにします\n", lunch);
 printf("店のオヤジ:まいど!%c ランチは「小麦スープ」だぜ!\n" ,lunch);
 lunch = lunch + 2;
 printf("ぷらんく:えっ、言い間違えました、%c ランチでした\n", lunch);
 printf("店のオヤジ:・・・\n");
}

実行すると、下のような結果になったと思います。

ぷらんく:お金がないのでお昼は格安 A ランチにします
店のオヤジ:まいど!A ランチは「小麦スープ」だぜ!
ぷらんく:えっ、言い間違えました、C ランチでした
店のオヤジ:・・・
char型の利用プログラム。店のオヤジへの注文キャンセル

店のオヤジへの注文キャンセル

では一行づつ見ていきましょう。

char型への値の代入

4行目で、char 変数名 = 変数に設定する値; という書き方が登場します。
前回、「int 変数名 = 整数;」 という似たようなプログラムを書きました。
ちなみに、4行目は下の2行に分解できます。

 char lunch = 'A';
 char lunch;
 lunch = 'A';

分解後で見たほうがわかりやすいですね。
char lunch;
ですが、この lunch は char型の変数で宣言 されており、以降、char型にあった数値やら文字やらを入力できる、という意味になります。
そして、
lunch = ‘A’;
ですが、lunch に1文字「A」を入力する、という意味になります。

変数lunchに'A'を代入
実際には英文字や数字、一部記号なども数字(もっといえば 0 と 1 の組み合わせ)で管理されており、「‘A’」という書き方は文字「A」にあたる整数に変換して、変数lunch に入力してね。という意味になります。

英文字・数字・記号 ⇔ 整数の変換表は「ASCIIコード表」と呼ばれ、C言語以外のコンピュータ全般で今でも非常に広く使われています。
この記事の末尾にASCIIコード表を書いておきますね。
このASCIIコード表をみてもらうと、A という英字 1文字は整数の「65」に変換されます。
これは最初から lunch に整数 65 を入力しても、同じ結果になるということです。
実際に次の行に書き換えて見てください。同じ結果になったかと思います。なるといいな。

char lunch = 65;

日本語の扱い

さきほどの4行目で、char型は1文字を入れることができるとお話したかと思います。
もし、上のソースコードで char 型に ‘あ’ とか試した方はただしく画面上に文字がでなかったかと思います。こんな感じで、「・」で文字化けしちゃっていますね。

ぷらんく:お金がないのでお昼は格安 ・ ランチにします

じつは日本語の一文字はプログラム上、2文字だったり3文字だったりで取り扱われるような仕組みとなっています。確実に1文字として入るのは ASCIIコード表に書いてある、英文字や数字、記号などです。
詳しい話は別の機会にするとして、簡単にお話すると、 char型は 0~255 の整数しかもてない作りになっています。日本語は種類もおおくて、この整数の種類だけでは表現できないのです。ですので、 char を複数個使って一文字を表現することになっています。
そして、 char = ‘あ’ とか書いてしまうと、1文字に入りきらずに溢れてしまい、結果としてうまく表示できないことになってしまいます。

次の記事で、日本語を表示するときの変数への代入方法をかきますね。

printf 関数で1文字を表示する

次の行にすすみます。

 printf("ぷらんく:お金がないのでお昼は %c ランチにします\n", lunch);
 printf("店のオヤジ:まいど!%c ランチは「小麦スープ」だぜ!\n" ,lunch);

実際にプログラムを動かした方であれば、新しくでてきた「%c」の役割はなんとなく想像がついているかもしれませんが、「%c」は整数をASCIIコード表上の1文字に変換して表示する変換指定子となります。
以前は整数を %d 、浮動小数点数(小数)を %f で表示していたかと思います。その種類の一つとなります。

ちなみに、 %c の cCharacter(訳:文字)の頭文字だと思います。
英単語と結びつけると覚えやすいですね。よく使うものだけでも覚えておくと便利だとは思います。

char型で計算

次の行にすすみます。
実際にゲームプログラミングでこんなプログラムを書いたらわかりずらいので、あくまで仕組みを理解するためのものです。

 lunch = lunch + 2;

この行は見ての通り足し算の計算をしています。
でも計算に独特のルールがあるので、基本を覚える必要があります。
右辺の計算結果が左辺の変数に代入されるので、まず右辺を見てみましょう。
「lunch + 2」とあります。lunch にはこの時点で ‘A’ が代入されていましたね。
‘A’ というのは整数の 65 です。
つまり変数 lunch には整数 65 が入っているので右辺は「65 + 2」となり、足し算の結果「67」となります。ここで、右辺の結果を踏まえてみると、
lunch = 67;
をしていることになります。
この行は「変数 lunch に 2 を足す」という処理をしたことになります。

char型で整数を計算した結果の表示

次の行で char 型で整数の計算をした結果を表示しています。
やっているのは、5~6行目と同じです。

 printf("ぷらんく:えっ、言い間違えました、%c ランチでした\n", lunch);

結果は C ランチになってましたでしょうか。
この時点で変数 lunch には整数 67 が入っています。「%c」で1文字を表示するとき、整数 67 に相当する文字を ASCII コード表のルールに従って表示しています。
ASCII コード表のルールでは整数 67 は文字「C」になるため、このような結果になったのでした。

今回はここまで。お疲れさまでした。
次回は日本語の文章(文字列)を変数として宣言したり使ってみたり、をお話したいと思います。

ASCIIコード表

ASCIIコード表
0123456789101112131415
NULSOHSTXETXEOTENQACKBELBSHTLFVTFFCRSOSI
16171819202122232425262728293031
DLEDC1DC2DC3DC4NAKSYNETBCANEMSUBESCFSGSRSUS
32333435363738394041424344454647
空白!#$%&()*+,./
48495051525354555657585960616263
0123456789:l<=>?
64656667686970717273747576777879
@ABCDEFGHIJKLMNO
80818283848586878889909192939495
PQRSTUVWXYZ[\]^_
96979899100101102103104105106107108109110111
`abcdefghijklmno
112113114115116117118119120121122123124125126 
pqrstuvwxyz{|}~ 

このASCIIコード表ですが、0~126の整数と変換される文字・記号・数字などを表しています。0~31までは制御文字と呼ばれるもので、たとえば整数の 7 は「ベルを鳴らす」という特殊文字をつかったプログラムはこんな感じです。

char tokusyumoji=7;
printf("特殊文字を表示してみよー!文字=「%c」", tokusyumoji);

実行しても画面上に文字の中身はでないとおもいます。でも、動かす環境によっては「ぴーー!」とかなにやらまずそうな音が鳴ったかもしれません。

特殊文字はそれぞれ、特別な条件や特殊なデータ、プログラム上で使うように設計されていたりします。このシリーズでは、制御文字は「0(NULL)」「10(改行コード)」「13(復帰コード)」くらいしか利用しないと思います。(実はすでにいままでのプログラムでも内部では使われていたり・・)
それ以外の特殊コードの詳細はここではご説明しませんが、ASCIIコード表自体は必要なときにこのページに立ち戻って確認できればよいな、と思っています。

あとがき

char型という一文字表示するための型についてお話しました。それだけでもだいぶ長くなってしまいました。
今回はここまで。お疲れさまでした。

イチからゲーム作りで覚えるC言語
連載ページ一覧へ
2章05 文字列変数の宣言、初期化と表示
NEXT : 2章05 文字列変数の宣言、初期化と表示
2章03 変数を使ったレベルや体力など表示する : PREV

非常に参考になったサイトさまや、参考文献など

ページの更新履歴

更新日更新内容
更新なし