ページ 1 / 1
C言語のAsciiコード、文字列がよくわからない
Posted: 2015年5月29日(金) 11:56
by ペパーミント
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' を引く必要があるんですか?
Re: C言語のAsciiコード、文字列がよくわからない
Posted: 2015年5月29日(金) 12:06
by usao
>cnt[ch - '0']++; //この '0' はどうして必要なんですか?
引かない場合,すなわち ここを
cnt[ ch ]++;
とした場合において
例えば ch の値が'0' であるとき
配列cnt[]の何番目の要素にアクセスすることになるのかわかりますか?
(chの値をprintf()等で表示して見てみるといいかも)
Re: C言語のAsciiコード、文字列がよくわからない
Posted: 2015年5月29日(金) 22:06
by みけCAT
オフトピック
ペパーミント さんが書きました:C言語のAsciiコード、文字列がよくわからない
いつからそれがAsciiコードだと錯覚していた…(定義されていないと聞いた気がする)
Re: C言語のAsciiコード、文字列がよくわからない
Posted: 2015年5月30日(土) 00:16
by box
アスキーコードに限らず、'0'~'9'に割り当ててあるコード番号が
連続していれば、'0'~'9'から'0'を引くことで数値の0~9に変換できます。
くだんのコードでは、
ch
に
'0'~'9'
のいずれかが入っていれば、それから'0'を引くことで
0~9
に変換できます。その結果、
配列の[0]~[9]には
'0'~'9'
の出現回数が入る、というわけです。
Re: C言語のAsciiコード、文字列がよくわからない
Posted: 2015年6月14日(日) 18:11
by taka
cnt[ch - '0']++; //この '0' はどうして必要なんですか?
簡単に言うと、'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なんだよね