C言語-インタプリタminiCASL |
3. 命令を文字列にする
このままでは、命令が数字なのでわかりにくい。そこで、命令を簡単な英単語にする。
例 加算:add 減算:sub 乗算:mul 除算:div 終了:end
文字はコンピュータ内部では、コード(整数)として扱われる。例えば、'a'のコードは0x61のように各文字にコードが1バイトで決められている。これをキャラクターコード(アスキーコード)という。
日本では、漢字を扱う必要があるが、それぞれの漢字にもコードが決められている。ただし、漢字は種類が多く、1バイトでは足りないのでコードは2バイトで決められている。この2バイトの文字を全角文字といい、それに対して1バイトの文字を半角文字という(単に、半角、全角ということもある)。
次に、主な漢字(日本語)コードを示す。UNIXの多くは、EUCコードである。
第1バイト | 第2バイト | |
---|---|---|
JISコード | 0x21 - 0x98 | 0x21 - 0x7E |
シフトJISコード(S-JIS) | 0x81 - 0x9F, 0xE0 - 0xFC | 0x40 - 0x7E, 0x80 - 0xFC |
EUCコード | 0xA1 - 0xFE | 0xA1 - 0xFE |
char型変数は1バイト分の領域しかないので、文字列や漢字コードを扱う場合には、配列を使用しなければならない。
文字列を処理する関数は、string.hで定義されているので、#include <string.h>が必要になる。関数名の多くは、strで始まっている。
次に、データファイルindataの命令に相当する部分を英単語の命令語に換えて、これが処理できるようにプログラムを変更する。ファイル名は、reidai01.mcとして作成しておく。
1 | add | ||
12.34 | → | 12.34 | |
11.11 | 11.11 | ||
0 | end |
add 12.34 11.11 end |
命令語は文字列であり、文字列どうしが同じかどうかを判定するには、関数strcmpを使用する。
[mc04.c] | |
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 23: 24: 29: 30: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: |
#include <stdio.h> #include <stdlib.h> #include <string.h> void main(void) { double data1, data2, ans; char buff[80]; while(1){ gets(buff); if(!strcmp(buff, @ )){ /* 命令判定 */ gets(buff); /* 文字列入力 */ data1 = atof(buff); /* 実数値に変換 */ gets(buff); /* 文字列入力 */ data2 = atof(buff); /* 実数値に変換 */ ans = data1 + data2; }else if(!strcmp(buff, A )){ <<赤色の部分(13〜16行)と同じ>> ans = data1 - data2; }else if(!strcmp(buff, B )){ <<赤色の部分(13〜16行)と同じ>> ans = data1 * data2; }else if(!strcmp(buff, C )){ <<赤色の部分(13〜16行)と同じ>> ans = data1 / data2; }else if(!strcmp(buff, D )){ break; }else{ printf("Error : Number 0 - 4\n"); continue; } printf("%f\n", ans); /* 結果表示 */ } } |
D:Data\src>cc mc04.c D:Data\src>mc04 < reidai01.mc 23.450000 |
命令判定の部分で関数strcmpの前に“!”が付けてある。これは、2つの文字列が同じとき、関数strcmpの結果が0(0は偽)になり、これを!で真に変えている。したがって、ていねいに書けば次のようになる。
if(strcmp(buf, ) == 0){
“!”は否定演算子で、真と偽を入れ換える演算を行う。
Copyright © 2001 Hiroshi Masuda |