タイトルのようなプログラムをCで作ろうとしています。ちなみに初学者です。
たとえば 32356695 と入力すると
'0' appeared 0 times.
'1' appeared 0 times.
'2' appeared 1 times.
'3' appeared 2 times.
'4' appeared 0 times.
'5' appeared 2 times.
'6' appeared 2 times.
'7' appeared 0 times.
'8' appeared 0 times.
'9' appeared 1 times.
と表示されるようにしたいです。そこで以下のようなプログラムを組みましたが
コンパイルは成功するもexeを実行すると数字入力後エラーメッセージが出ます。
*************************************************
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main(void)
{
int i;
int count[10]={0};
int length;
int digit;
char str[100];
printf("Please input number:");
gets(str);
length = strlen(str);
for(i=0;i<length;i++){
if(str[i]>='0' && str[i]<='9'){
digit = atoi(&str[i]);
count[digit]++;
}
}
for(i=0;i<=9;i++){
printf("'%d' appeared %d times.\n",i,count[i]);
}
return(0);
}
******************************************************
よくわからないのですが何故か文字列の長さを収納する変数lengthが1になているようです。
どうかお力添えください。お願いいたします。
コンパイラはbcc32、OSはWindowsXPです。
No.4ベストアンサー
- 回答日時:
がるです。
> しかし何故digit = atoi(&str[i]);はダメで、がるさんの言うように
> 別の配列に入れなおすとうまく行くのでしょうか。
うい。ではちょっと詳細に。
例えば、strに
0123
と入ってるとします。正確には文字の後ろに¥0が入っているので、¥0をnで表現するとして
0123n
となります。
今回取得したいのは、0であったり1であったりといった「数字一桁」になります。
では、i=0の場合の&str[i]を考えて見ます。
str[i]は今回str[0]になるので、文字の先頭は0になります。ただ、atoiは「char *」を引数として期待しているため、当然のように「¥0があるところまで」を数字として取ってきます。
0123n
あれ?
これでは、取りたい数字になりません。
# このあたり、元のソースで、atoiの直後に、printfでdigitの値をprintするとわかります。
で。そのために「一文字だけを格納した別領域」を用意してやります。
それがcwk文字配列になります。
ちなみに、cwkは「char work」の略です(笑
ええあまり推奨できるネーミングではありませんが…便利なので、局所に限ってはたまに使います。特にテスト用のコードの場合。
こんなんで説明になりますでしょうか?
あと。#3さんのおっしゃるようなやり方もありです。ただしそれはASCIIコードなどに依存するので、一応コメントにそんな風に書いておいたほうがよいです(0-9が不連続にマッピングされているコード体系も存在するので)。
No.5
- 回答日時:
#include <stdio.h>
int main(void){
int i;
int count[10]={0};
char str[100];
printf("Please input number:");
gets(str);
for(i=0;str[i];i++)
if('0' <= str[i] && str[i] <= '9')
count[str[i]-'0']++;
for(i=0;i<=9;i++)
printf("'%d' appeared %d times.\n",i,count[i]);
return(0);
}
No.2
- 回答日時:
このような場合、実行時に出力されるというエラーを併せて書いていただくといいと思います。
とても重要な情報なのですが。
あと、たとえば、エラーが出る場合に、入力を
0
1
2
とか、やってみるといろいろヒントがつかめるものです。
さて、atoi() は、「文字列を数値に」直す関数です。
ですから、
1234567890
と入力した場合、最初の digit の値は、(整数としての)1234567890 になります。
ここで、count[1234567890] をインクリメントしようとして、(設定によっては)エラーが表示されることになります。
あと、length が 1 になる要素はなさそうだと思いますが、そのあたりも、どのように確認したのかがあると、いろいろわかると思います。
うーん、よくわからないのですが、
つまりatoiは文字列のうちの1個のstr[i]を数値にするのではなく
文字列str全体を数値にすることしか出来ないということでしょうか?
つまり
digit=atoi(&str[i]);はatoiの使い方が間違っていて
digit=atoi(str)という書き方しかできない、ということでしょうか?
あとlengthが1になるというのは正直ちょっと違う状況、、、
実は文字を読み込むときgets(str)かscanf("%c",str)なのかわからず
両方試したんですが、後者の時にprintf("%d",length)とすると
1と表示されたのです。なのでgetsのときでは無かったです。
申し訳ありません。
No.1
- 回答日時:
がると申します。
何点か。1.ループについて
単純に
for(; str[i] != '\0'; i++) {
でも良いと思うのですがどうでしょうか?
2.
できればgetsではなくてfgetsを使うとよいです。
3.
データ取得のところですが。
digit = atoi(&str[i]);
だとうまくいかないです。
char cwk[4];
を宣言した後に
cwk[1] = '\0';
if(str[i]>='0' && str[i]<='9'){
cwk[0] = str[i];
digit = atoi(cwk);
という感じでもっていくと、うまくいきます。
# ここがうまくいかない理由が直接的にカウントがうまくいっていない理由です。
参考になれば幸いです。
・・・うまくいきました!!!
おっしゃるとおり3のところが問題だったようです。
しかし何故digit = atoi(&str[i]);はダメで、がるさんの言うように
別の配列に入れなおすとうまく行くのでしょうか。
正直考えてもさっぱりで、願わくばご教授いただきたいです。
あとcwkって何の略なのでしょう。妙に気になります笑。
とにもかくにも、ほんとうにありがとうございます!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
charでの計算?
-
文字列から空白を取り除きたい...
-
ネットワークにつながっている...
-
【C言語】テキストファイル内の...
-
c++ 文字列を入力して、一文字...
-
char型からのバイト数取得
-
間接操作のレベルとは
-
atoi( ) の反対をやりたい
-
'const char *' 型は 'char *' ...
-
絶対パスからのファイル名の切...
-
全角文字を含んだ文字の並びを...
-
C言語 文字列操作
-
Visual Studio strcpyについて
-
c言語プログラミング実行時エラ...
-
C言語です
-
テキストデータをそのままバイ...
-
str系関数を使わずに二つの文字...
-
charからLPTSTRへの変換方法
-
char* を渡したとき、不適切なP...
-
int型からchar型への変換
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CStringをwchar_tに変換したい
-
fgetsなどのときのstdinのバッ...
-
charからLPTSTRへの変換方法
-
C言語のfor文です。 繰り返しの...
-
文字列から空白を取り除きたい...
-
配列をnビットシフトする
-
間接操作のレベルとは
-
charでの計算?
-
テキストデータをそのままバイ...
-
型変換
-
'const char *' 型は 'char *' ...
-
double型の値をchar配列に変換...
-
間接参照のレベルが異なっています
-
干支のプログラム
-
atoi( ) の反対をやりたい
-
C言語です
-
絶対パスからのファイル名の切...
-
ネットワークにつながっている...
-
【C言語】文字型と整数型の違い
-
Win32APIでのエディットボック...
おすすめ情報