プロが教えるわが家の防犯対策術!

C言語を学んであまり経っていない初心者です。
勉強していてどうにもわからないので質問させていただきたいと思います。

以下のプログラム、文字列stに含まれている数字文字'0'~'9'の個数を、cnt[0]cnt~[9]に格納して、数字文字'9'が文字列stにいくつ含まれているかを確認するプログラムです。

疑問なのは関数cntdigit内のwhile文内の
cnt[*st - '0']++;というところです。
- '0'は何の役割を果たしているのでしょうか。
ためしに- '0'を抜いて実行したら数字文字がstに入力されるとエラーが発生します。

#include<stdio.h>

void cntdigit(char *st, int *cnt)
{
int i;

for (i = 0; i < 10; i++)
*(cnt + i ) = 0;

while (*st) {
if (*st >= '0' && *st <= '9')
cnt[*st - '0']++; ←ここ
st++;
}
}


int main(void)
{
int cnt[9];

char st[100];

printf("文字列を入力してください : ");
scanf("%s" , st);

cntdigit(st , cnt);

puts("格納しました。 ");
printf("9の数は%dです。", cnt[9] );

return (0) ;
}

A 回答 (4件)

> 今、*stが'9'(配列の要素である'9')であるとき、


> [*st - '0']←この[]内の部分は数字で表現したいので、- '0'を書き足すことにより、cnt[*st - '0']++;がcnt[9]++;となるようにしているということでしょうか?

その理解で大丈夫です。

> 変換するための技巧のような感じに見えますが・・どうでしょう。

技巧といえば技巧ですが、ごく一般的な慣用句のようなものです。
    • good
    • 0
この回答へのお礼

安心しました。ありがとうございました。

お礼日時:2006/05/21 20:38

ついでに私も補足しておくと、char型が何ビットかは処理系に依存しますが、C/C++では、char型のサイズのことを1バイトと呼びます。

また、char型が符号付きか符号なしかも処理系に依存します。

ちなみに、'0'などの文字定数(文字リテラル)は、Cではint型ですが、C++ではchar型になります。

この回答への補足

疑問点である cnt[*st - '0']++;の部分で、
今、*stが'9'(配列の要素である'9')であるとき、
[*st - '0']←この[]内の部分は数字で表現したいので、- '0'を書き足すことにより、cnt[*st - '0']++;がcnt[9]++;となるようにしているということでしょうか?
変換するための技巧のような感じに見えますが・・どうでしょう。

補足日時:2006/05/20 18:01
    • good
    • 0

#1の方の補足。


> 例えば'1' は、文字コードで言えば0x31です。
0x31になるのも、文字コード依存です。
必ずそうである保証はC/C++ではありませんので、
違う文字コードを使う処理系もありえます。
ただし、'0'~'9'が連番であることを保証する
規定になっていますので、'0'等を使って計算する
方が規格上は汎用的です。
    • good
    • 0

char は、文字ではありますが、1バイト(サイズは処理系によって違うかもしれませんが)の(符号付き)数値でもあります。


例えば'1' は、文字コードで言えば0x31です。
char c = '1';
の時 c を数字としてみた場合 49 (0x31)が入っているということです。
ここで、文字コードは'0' ~ '9' の順に並んでいて1つずつ大きくなっているということが期待できるので、
数字を表す文字 - '0' は、その文字位置に応じた数値になって数値に置き換えることができます。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!