C言語のAsciiコード、文字列がよくわからない

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ペパーミント

C言語のAsciiコード、文字列がよくわからない

#1

投稿記事 by ペパーミント » 10年前

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' を引く必要があるんですか?

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

Re: C言語のAsciiコード、文字列がよくわからない

#2

投稿記事 by usao » 10年前

>cnt[ch - '0']++;    //この '0' はどうして必要なんですか?

引かない場合,すなわち ここを
cnt[ ch ]++;
とした場合において
例えば ch の値が'0' であるとき
配列cnt[]の何番目の要素にアクセスすることになるのかわかりますか?
(chの値をprintf()等で表示して見てみるといいかも)

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: C言語のAsciiコード、文字列がよくわからない

#3

投稿記事 by みけCAT » 10年前

オフトピック
ペパーミント さんが書きました:C言語のAsciiコード、文字列がよくわからない
いつからそれがAsciiコードだと錯覚していた…(定義されていないと聞いた気がする)
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

box
記事: 2002
登録日時: 14年前

Re: C言語のAsciiコード、文字列がよくわからない

#4

投稿記事 by box » 10年前

アスキーコードに限らず、'0'~'9'に割り当ててあるコード番号が
連続していれば、'0'~'9'から'0'を引くことで数値の0~9に変換できます。
くだんのコードでは、
ch

'0'~'9'
のいずれかが入っていれば、それから'0'を引くことで
0~9
に変換できます。その結果、
配列の[0]~[9]には
'0'~'9'
の出現回数が入る、というわけです。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

taka
記事: 34
登録日時: 11年前
住所: 三重県

Re: C言語のAsciiコード、文字列がよくわからない

#5

投稿記事 by taka » 10年前

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なんだよね

閉鎖

“C言語何でも質問掲示板” へ戻る