![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
下記のプログラムは数字の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'を引けば、テーブルのインデックスが得られます』とありますが、これもよく分かりません。
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_03.png?5a7ff87)
No.2ベストアンサー
- 回答日時:
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
回答ありがとうございます!!
インデックスを得るために文字コードが連続しているのを利用して'0'(10進でいう48)で引いていたんですね。判りました!
回答ありがとうございました!!
No.3
- 回答日時:
文字コードというのをご存知でしょうか?
アスキーコードというルールに従うと
以下のように決まっているんです。
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 が得られるということです。
回答ありがとうございます
文字コードの存在は知っていて、アルファベットは連続してならんでいることは知っていました。数字については知りませんでした。アスキーコードの存在に気がつかなかったのは落度でした…
回答ありがとうございました!!
No.1
- 回答日時:
'0'は、「0」という文字の文字コードです。
具体的には10進数でいうと48です。
一方で、numは、やはり入力した数字の文字コードです。
0・・・48
1・・・49
2・・・50
(途中省略・・・・・・・・)
9・・・57
です。
ここで、0から9までの文字コードが連続しているところがミソです。
これが連続しているから、入力した数字の文字コードと、0の文字コードの差を求めると、入力した数字の数値としての値が得られることになります。
同様にa~z、A~Zなんかも文字コードが連続しているので、同様の手法はよく使います。
参考URL:http://e-words.jp/p/r-ascii.html
回答ありがとうございます!
文字コードが関係してたんですね!気が付きませんでした!
文字として入力した数字の文字コードから'0'、つまり48引いて、インデックスとして使っているんですね。
回答ありがとうございました!!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C言語でif文が予想と違う動きをする件について7 4 2023/03/20 00:26
- C言語・C++・C# C pointer? or... 2 2022/03/29 00:47
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラミング初心者です。 Py...
-
プログラム(C)
-
*をユーザーが入力した数字の数...
-
プログラミング・C言語の配列(...
-
コマンドプロンプトからのEOFの...
-
正負を反転させて出力するプロ...
-
作成したいプルグラムがあります。
-
VBでの日付入力値のフォーマッ...
-
cout関数を使っているのですが...
-
c言語が初心者です。教えていた...
-
C言語でつるかめ算をするにはど...
-
batプログラム上で文字列を入力...
-
C言語の入出力関数の違い
-
エクセルワークシート上で、1、...
-
VisualStudio2019のコードアナ...
-
数値の連続入力終了条件について
-
入力されたとき,何も入力しな...
-
double型が正常に認識されてい...
-
アセンブラ言語CASLIIのプ...
-
C言語 自然数の四則演算 エラ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
*をユーザーが入力した数字の数...
-
数字以外が入力されたらエラー...
-
正負を反転させて出力するプロ...
-
プログラミング初心者です。 Py...
-
java初心者です。入力されたの...
-
Eclipseコンソール表示を、リセ...
-
scanfが2回使えない・・・?;
-
C言語 逆ピラミッドの作り方
-
double型が正常に認識されてい...
-
ワードで文字を入力する時の変...
-
コマンドプロンプトからのEOFの...
-
Linuxで入力待ちなしkeyread関...
-
scanf が無視されます
-
if文の条件にscanf関数を使うと…?
-
C言語について
-
cout関数を使っているのですが...
-
enterでループ終了
-
"scanf"でエンターで改行させな...
-
C言語でgetchar();が上手く使え...
-
C言語scanf_sで何故か2回入力に...
おすすめ情報