code
int main(){
int i, ch;
int cnt[10] = {0};
while (1){
ch = getchar();
if(ch == EOF)
break;
if(ch >= '0' && ch <= '9')
cnt[ch - '0']++; //この '0' はどうして必要なんですか?
}
puts("数字文字の出現回数");
for(i = 0; i < 10; i++)
printf("'%d' : %d\n", i, cnt);
return 0;
}
/code
C言語はじめて半年くらいです。どうして '0' を引く必要があるんですか?
C言語のAsciiコード、文字列がよくわからない
Re: C言語のAsciiコード、文字列がよくわからない
>cnt[ch - '0']++; //この '0' はどうして必要なんですか?
引かない場合,すなわち ここを
cnt[ ch ]++;
とした場合において
例えば ch の値が'0' であるとき
配列cnt[]の何番目の要素にアクセスすることになるのかわかりますか?
(chの値をprintf()等で表示して見てみるといいかも)
引かない場合,すなわち ここを
cnt[ ch ]++;
とした場合において
例えば ch の値が'0' であるとき
配列cnt[]の何番目の要素にアクセスすることになるのかわかりますか?
(chの値をprintf()等で表示して見てみるといいかも)
Re: C言語のAsciiコード、文字列がよくわからない
オフトピック
いつからそれがAsciiコードだと錯覚していた…(定義されていないと聞いた気がする)ペパーミント さんが書きました:C言語のAsciiコード、文字列がよくわからない
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: C言語のAsciiコード、文字列がよくわからない
アスキーコードに限らず、'0'~'9'に割り当ててあるコード番号が
連続していれば、'0'~'9'から'0'を引くことで数値の0~9に変換できます。
くだんのコードでは、
ch
に
'0'~'9'
のいずれかが入っていれば、それから'0'を引くことで
0~9
に変換できます。その結果、
配列の[0]~[9]には
'0'~'9'
の出現回数が入る、というわけです。
連続していれば、'0'~'9'から'0'を引くことで数値の0~9に変換できます。
くだんのコードでは、
ch
に
'0'~'9'
のいずれかが入っていれば、それから'0'を引くことで
0~9
に変換できます。その結果、
配列の[0]~[9]には
'0'~'9'
の出現回数が入る、というわけです。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
Re: C言語のAsciiコード、文字列がよくわからない
簡単に言うと、'0'≠0なんですよ。cnt[ch - '0']++; //この '0' はどうして必要なんですか?
そして文字コード表では'0'から'9'まで順に並んでいます。
例えば'0'が0x30(48)だったとしましょう。
連続して'0'から'9'まで並んでいるとすれば
'1'は0x31(49)になりますよね。
そこでこの一文字を数字(1)にしたかったら、
0x30(48)、つまり’0’を引けばいいわけです。
49-48=1で、ちゃんと1になります。
もし何も引かずにcnt[ch]++とすると
chが'2'だったらcnt[50]をインクリメントしてしまうので
うまくいきませんよね。
理屈こねるより覚えといたほうが簡単ですけど(笑)
オフトピック
'0'、例えばって言ってるけどほんとに0x30なんだよね