明日への断片

ゲーム制作やプログラミング関する記事を中心に更新していこうと思います。

35欠片目:アスキーコードで 文字⇔数字

 こんにちは。甘党でもあり辛党でもあるvoidです。基本的に食べ物は何でも好きです。


本日は、地味に役立つアスキーコードについて書いていきます。

文字は計算できる?

/*test01.c*/
#include <stdio.h>

int main(void)
{
	int a = 2;
	int b = 3;

	printf("%d+%d = %d\n", a, b, a + b);
	return 0;
}

 上記はC言語の基本的なプログラムで、整数同士の計算を行っています。


実行結果はこのようになります。
f:id:yasu-game-void:20170315235142j:plain


ごく自然な結果です。このように整数の計算は問題なく行えます(むしろこれが出来なかったら問題アリですが...)


では、文字同士を計算するとどうなるのでしょうか?

/*test02.c*/
#include <stdio.h>

int main(void)
{
	char a = 'A';
	char b = 'B';

	printf("%c+%c = %c\n", a, b, a + b);

	return 0;
}


実行結果はこちらです。
f:id:yasu-game-void:20170315235644j:plain

なるほど、AとBを足すと・になるそうです。

...これでは上手くいっているか分かりません。


では、文字と数字はどうでしょうか?

/*test03.c*/
#include <stdio.h>

int main(void)
{
	char a = 'A';
	int b = 1;

	printf("%c+%d = %c\n", a, b, a + b);

	return 0;
}


実行結果はこちらです。
f:id:yasu-game-void:20170316000158j:plain


...おや。

Aに1を足すとBになるそうです。これは何か関係がありそうですね。
実際、Aに2を足すとCに、3を足すとDになります。

種明かし編

 実は文字は内部的には整数値で扱われています。そのためAに1を足すとAの数字の次の数値であるBとなったわけです。

test03.cのプログラムで、char型を標準出力するときに「%c」ではなく「%d」を使って表示してみると
f:id:yasu-game-void:20170316000941j:plain
こんな感じになります。

'A'は内部では65として扱われているようです。




お待たせしました。ここでようやくアスキーコードの説明に入ります。
アスキーコードとはこのように文字や数字や記号を整数値に割り当てた文字コードのことです。

【定期】いつ使うの?

 文字を数字にしたところでどうなるのって思うかもしれませんが、これはとある場面で非常に重要な役割を果たします。

それはいつかというと、ファイルからデータを読み込むときです。
プログラムで扱うデータをプログラム内に書くこともできますが、データは別のファイルから読み込めるようにしておくと何かと都合がいいのです。ゲームでいうと、セーブデータやマップデータなどが想定されます。

例えば、セーブデータをテキストで保存して「プレイヤーのレベル = 1」というデータがあるとします。
その「1」の部分を使おうとファイルから読み込んだとしても、それは文字としての「1」でしかありません。


ここで、アスキーコードを使うことで文字の「1」数字の「1」に変換してあげることが出来るのです。



アスキーコードから整数値に変換するにはatoi関数(ascii to integer)を使用します。
atoi関数を使うにはstdlib.hをインクルードする必要があります。

引数はchar型のポインタ(文字列)で、戻り値は変換された整数値を返します。変換不能な場合は0を返します。

char* data= "1";
int player_level= atoi(data);

これで、文字を数値に変換して扱うことができます。




因みに、sample02では足した数字がコードが用意されている127よりも大きくなてしまっていたので、残念ながらA+Bが・というわけではないようです。


ASCII

 最後にASCIIコード表のリンクを貼っておきます。
本日は以上。ではまた!