- ベストアンサー
C言語の質問です
下記のプログラムは数字の0から9を意味する英単語の文字列テーブルを作成し、それからユーザーに(文字として)数字を入力させ、このテーブルを使って該当する単語を表示するものです #include <stdio.h> #include <conio.h> int main(void) { char digits[10][10] = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" }; char num; printf("数字を入力してください: "); num = getche(); printf("\n"); num = num - '0'; if(num>=0 && num<10) printf("%s", digits[num]); return 0; } num = num - '0' とするのが分かりません。 使っている本には、ヒントとして 『入力された文字から'0'を引けば、テーブルのインデックスが得られます』とありますが、これもよく分かりません。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
num = getche(); で入力されるのは文字としての数字です。 "0"なら30H(48)になります。 "0"から"0"を引くと当然 0 になります。 "1"なら31H(49)になりますから、同じように"0"を引くと 49-48=1 となり、"1"を入力したときのインデックス 1 が得られます。 同じように"9"までの配列なので、"0"を引くことでテーブルのインデックスが得られるのです。 判ります? 因みに、 文字 16進数 10進数 0 30H 48 1 31H 49 2 32H 50 3 33H 51 4 34H 52 5 35H 53 6 36H 54 7 37H 55 8 38H 56 9 39H 57
その他の回答 (2)
- SpiralGalaxy
- ベストアンサー率39% (649/1653)
文字コードというのをご存知でしょうか? アスキーコードというルールに従うと 以下のように決まっているんです。 0という文字 --> 48番 1という文字 --> 49番 2という文字 --> 50番 3という文字 --> 51番 4という文字 --> 52番 5という文字 --> 53番 6という文字 --> 54番 7という文字 --> 55番 8という文字 --> 56番 9という文字 --> 57番 なので、あなたがキーボードから '5' を入力しても コンピュータはそれが数値の 5ではなく 53 と認識しているということです。 つまりその数値から '0' (48)を引くとその数字に対応する 数値が得られるということです。 例えば '5'は 53です。これから 48を引くと初めて 数値の 5 が得られるということです。
お礼
回答ありがとうございます 文字コードの存在は知っていて、アルファベットは連続してならんでいることは知っていました。数字については知りませんでした。アスキーコードの存在に気がつかなかったのは落度でした… 回答ありがとうございました!!
- agricap
- ベストアンサー率40% (79/195)
'0'は、「0」という文字の文字コードです。 具体的には10進数でいうと48です。 一方で、numは、やはり入力した数字の文字コードです。 0・・・48 1・・・49 2・・・50 (途中省略・・・・・・・・) 9・・・57 です。 ここで、0から9までの文字コードが連続しているところがミソです。 これが連続しているから、入力した数字の文字コードと、0の文字コードの差を求めると、入力した数字の数値としての値が得られることになります。 同様にa~z、A~Zなんかも文字コードが連続しているので、同様の手法はよく使います。
お礼
回答ありがとうございます! 文字コードが関係してたんですね!気が付きませんでした! 文字として入力した数字の文字コードから'0'、つまり48引いて、インデックスとして使っているんですね。 回答ありがとうございました!!
お礼
回答ありがとうございます!! インデックスを得るために文字コードが連続しているのを利用して'0'(10進でいう48)で引いていたんですね。判りました! 回答ありがとうございました!!