
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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- Visual Basic(VBA) countifsについての質問 3 2023/03/08 13:45
- Visual Basic(VBA) VBAで時間(00:00形式)を積算(足し算)したい 1 2022/11/15 17:04
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
文字列から空白を取り除きたい...
-
fgetsなどのときのstdinのバッ...
-
charからLPTSTRへの変換方法
-
配列をnビットシフトする
-
CStringをwchar_tに変換したい
-
charでの計算?
-
テキストデータをそのままバイ...
-
【C言語】テキストファイル内の...
-
間接参照のレベルが異なっています
-
<>で囲まれた文字列を文字列の...
-
Linuxでフォルダ内全ファイル名...
-
英単語をアルファベット順に
-
switch文で文字を比較すること...
-
atoi( ) の反対をやりたい
-
コマンドラインに入力されてい...
-
C言語のfor文です。 繰り返しの...
-
至急!C言語文字列置換
-
間接操作のレベルとは
-
getchar()を int でとる理由...
-
PROCのコンパイルエラーの取り...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
文字列から空白を取り除きたい...
-
CStringをwchar_tに変換したい
-
charからLPTSTRへの変換方法
-
テキストデータをそのままバイ...
-
c++ 文字列を入力して、一文字...
-
'const char *' 型は 'char *' ...
-
間接操作のレベルとは
-
WORDをcharに変換する方法
-
strncpyと_tcsncpy_sのヌルの扱...
-
型変換
-
配列をnビットシフトする
-
atoi( ) の反対をやりたい
-
Win32APIでのエディットボック...
-
間接参照のレベルが異なっています
-
c言語配列の結合についてです。...
-
【C言語】テキストファイル内の...
-
double型の値をchar配列に変換...
-
switch文で文字を比較すること...
-
C言語のfor文です。 繰り返しの...
おすすめ情報