
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) ;
}
No.3
- 回答日時:
ついでに私も補足しておくと、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]++;となるようにしているということでしょうか?
変換するための技巧のような感じに見えますが・・どうでしょう。
No.2
- 回答日時:
#1の方の補足。
> 例えば'1' は、文字コードで言えば0x31です。
0x31になるのも、文字コード依存です。
必ずそうである保証はC/C++ではありませんので、
違う文字コードを使う処理系もありえます。
ただし、'0'~'9'が連番であることを保証する
規定になっていますので、'0'等を使って計算する
方が規格上は汎用的です。
No.1
- 回答日時:
char は、文字ではありますが、1バイト(サイズは処理系によって違うかもしれませんが)の(符号付き)数値でもあります。
例えば'1' は、文字コードで言えば0x31です。
char c = '1';
の時 c を数字としてみた場合 49 (0x31)が入っているということです。
ここで、文字コードは'0' ~ '9' の順に並んでいて1つずつ大きくなっているということが期待できるので、
数字を表す文字 - '0' は、その文字位置に応じた数値になって数値に置き換えることができます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
テキストデータをそのままバイ...
-
fgetsなどのときのstdinのバッ...
-
charからLPTSTRへの変換方法
-
C言語 文字列操作
-
CStringをwchar_tに変換したい
-
文字を16進変換
-
sprintfに同じ変数は使えるか
-
簡易grepコマンドの作成を自作...
-
コンパイルエラー invalid ope...
-
c++ 文字列を入力して、一文字...
-
【C言語】構造体内の領域解放(...
-
間接操作のレベルとは
-
c言語プログラミング実行時エラ...
-
double型の値をchar配列に変換...
-
16進数関数のhex関数について
-
構造体のアライメント調整
-
下記のプログラムがコンパイラ...
-
英単語をアルファベット順に
-
for文 アスタリスクで形を作る
-
C言語のポインターで詰まっている
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
構造体の各メンバにfor文からア...
-
fgetsなどのときのstdinのバッ...
-
文字列から空白を取り除きたい...
-
C言語のfor文です。 繰り返しの...
-
CStringをwchar_tに変換したい
-
間接参照のレベルが異なっています
-
c++ 文字列を入力して、一文字...
-
C言語の入力した文字を反転させ...
-
charからLPTSTRへの変換方法
-
ネットワークにつながっている...
-
'const char *' 型は 'char *' ...
-
テキストデータをそのままバイ...
-
c言語でユーザ関数を利用して入...
-
atoi( ) の反対をやりたい
-
間接操作のレベルとは
-
-'0'の意味について
-
double型の値をchar配列に変換...
-
Linuxでフォルダ内全ファイル名...
-
配列をnビットシフトする
-
型変換
おすすめ情報