質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

1回答

1473閲覧

[ C言語 ] 標準入力からの数字文字をカウントするプログラム

nao_13jp

総合スコア20

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

1クリップ

投稿2017/08/04 11:59

c言語について質問です。
標準入力からの数値文字をカウントするプログラムを作成したのですが、カウントされず、全ての数字文字が「0」と表示されます。
なぜカウントされないのが皆目見当がつきませんのでどなたかご教示ください。

int

1 int i,ch; 2 int cnt[10] ={0}; 3 printf("標準入力 = "); 4 while (ch = getchar() !=EOF) { 5 if (ch <='0' && '9'>= ch) 6 cnt[ch - '0']++; 7 } 8 for (i = 0; i < 10; i++) { 9 printf("'%d' => %d\n",i,cnt[i] ); 10 } 11 return 0; 12

<結果>
-> % ./test2
標準入力 = 3.1432356786
'0' => 0
'1' => 0
'2' => 0
'3' => 0
'4' => 0
'5' => 0
'6' => 0
'7' => 0
'8' => 0
'9' => 0

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

if (ch <='0' && '9'>= ch)じゃなくて、if (ch >='0' && '9'>= ch)では。


以下のコードで動作確認しました。

C

1#include <stdio.h> 2 3int main(void) { 4 int i,ch; 5 int cnt[10] ={0}; 6 printf("標準入力 = "); 7 while((ch = getchar()) !=EOF) { 8 printf("%c, ", ch); // printデバッグ 9 if('0' <= ch && ch <= '9') { 10 cnt[ch - '0']++; 11 } 12 } 13 for(i = 0; i < 10; i++) { 14 printf("'%d' => %d\n", i, cnt[i]); 15 } 16 17 return 0; 18}
  • printデバッグしよう。

そもそも入力できているのか?から疑う

  • とりあえずカッコは付ける

よっぽど可読性悪ければ、動作を確認した後外せばいいんです。

投稿2017/08/04 12:01

編集2017/08/04 12:20
LouiS0616

総合スコア35658

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nao_13jp

2017/08/04 12:09

ご指摘ありがとうございます。 修正しましたが、結果は変わらずです。
LouiS0616

2017/08/04 12:11

(ch = getchar() != EOF)を、((ch = getchar()) != EOF)に修正してみてください。
LouiS0616

2017/08/04 12:11

おそらく、判定結果の論理値(intだけど)がchに代入されています。
nao_13jp

2017/08/04 12:39

ご回答ありがとうございます。 うまく動きました。 検証のため、以下のコードで書き直したところきちんと動きましたので、やはり評価の順番がおかしかったようです。 ch = getchar; while(ch != EOF)
LouiS0616

2017/08/04 12:43

え、それで動きます? getchar → getchar()は誤植としても、無限ループしませんかね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問