• 締切済み

任意の文字列のアルファベットのカウント

任意の入力された文字列に対し、出現頻度の表示をしようと思って以下のように考えました。 #include<stdio.h> int main(){ int count[26]; char c; while((c=getchar())!='\n'){ if(c>='a'&&c<='z'||c>='A'&&c<='Z'){ count[c]++; } } printf("%c:%d\n",c,count[c]); } まだc初めて2週間くらいなので問題点を解決できません。どなたか教えてください。よろしくお願いします。

みんなの回答

  • kb-nike
  • ベストアンサー率36% (72/200)
回答No.5

int count[26]; → int count[52]; if(c>='a'&&c<='z'||c>='A'&&c<='Z'){ count[c]++; → if(c>='A'&&c<='Z') count[c-'A']++; if(c>='a'&&c<='z') count[c-'a'+26]++; printf("%c:%d\n",c,count[c]); → for(int i=0; i++; i<52){  if(i<26) printf("%c:%d\n",(char)(i+'A'),count[i]);  if(i>=26) printf("%c:%d\n",(char)(i-26+'a'),count[i]); } 注意:見やすくするために全角スペースを使っています。

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.4

★修正。 ・条件式間違った。ごめん。  間違い⇒if ( (c <= 'a') && (c <= 'z') ){←※2  正しい⇒if ( (c >= 'a') && (c <= 'z') ){←※2    間違い⇒else if ( (c <= 'A') && (c <= 'A') ){←※3  正しい⇒else if ( (c >= 'A') && (c <= 'Z') ){←※3

  • mac_res
  • ベストアンサー率36% (568/1571)
回答No.3

cは添え字の範囲を超えますね。 #include<stdio.h> int main(void) { int count[128]; int c; for (c = 0; c < 128; c++) { count[c] = 0; } while ((c = getchar()) != EOF) { if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) { count[c]++; } } for (c = 0; c < 128; c++) { if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) { printf("%c:%d\n", c, count[c]); } } return 0; }

emiko1986
質問者

補足

ご回答どうもありがとうございます。なんとか入力に対するカウントが得られました。さらにお聞きしたいことがあるのですが、文字の総数をカウントする際、if(c=c)...とやればできると思いましたがそうもいかないみたいなのでどうすればうまくいくでしょうか??

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.2

★最初に char c で宣言してはいけません。 ・getchar() 関数は1文字を取得しますが EOF も返します。  この EOF は -1 となっていますので char 型では受け取れません。  int 型で宣言して下さい。 ・それから count 配列は初期化しないとデタラメな数が入っているため正しくカウントが  行えません。注意! ・あと count[c]++ では正しく count[0] ~ count[25] の範囲にカウント値を加算できません。  さらに最後の printf では何を表示したいのですか? ・そのほか、main() 関数の最後に return(0) などを記述しましょう。 サンプル: #include <stdio.h> #include <ctype.h> ←※1 int main( void ) {  int count[ 26 ] = { 0 }; ←こうすると宣言と同時に初期化できます。  int c; ←注意!    while ( (c = getchar()) != EOF ){ ←EOF をチェックするように   if ( ch == '\n' ){    break; ←ループを抜る   }   if ( (c <= 'a') && (c <= 'z') ){←※2    count[c - 'a']++;   }   else if ( (c <= 'A') && (c <= 'A') ){←※3    count[c - 'A']++;   }  }  /* 表示部 */  return( 0 ); } 解説: ・上記のコメントを参考に。 ・あと英字判定は専用の関数があります。  isupper(c)…英大文字を判定  islower(c)…英小文字を判定  これを使えば次のようになります。  if ( islower(c) ){←※2   count[c - 'a']++;  }  else if ( isupper(c) ){←※3   count[c - 'A']++;  }  とできます。また、isupper、islower を利用するには ctype.h ヘッダファイルを  インクルードしないと使えません。 ・以上。参考に!

参考URL:
http://www9.plala.or.jp/sgwr-t/c/sec07.html
  • t_nojiri
  • ベストアンサー率28% (595/2071)
回答No.1

>while((c=getchar())!='\n'){ ループの終了判定おかしいですね。 変数cの代入に失敗したか成功したか判定しそうです。

関連するQ&A

専門家に質問してみよう