• 締切済み

C言語の標準関数についての質問です。

C言語の標準関数についての質問です。 実行結果が以下のようになるようにしたいのですが・・・ char moji[]="AB$c5kDp9#s*Gz"; ←この二行は用意されている変数です。 int cnt[4]; 実行結果↓ 英大文字:4 ←cnt[0] 英小文字:5 ←cnt[1] 数字文字:2 ←cnt[2] その他:3 ←cnt[3] 使える関数は ・isdigit ・islower ・isupper です。 ↓ 自分で作ったのですがなかなかできません>< #include <stdio.h> #include <ctype.h> void main(void) { char moji[]="AB$c5kDp9#s*Gz"; int cnt[4]={0,0,0,0},flg; cnt=0; while(flg!='\0') { flg=isupper(moji[cnt]); if(flg!=0) { cnt[0]++; } flg=islower(moji[cnt]); if(flg!=0) { cnt[1]++; } flg=flgisdigit(moji[cnt]); if(flg!=0) { cnt[2]++; } else { cnt[3]++; } } printf("英大文字:%d\n",cnt[0]); printf("英小文字:%d\n",cnt[1]); printf("数字文字:%d\n",cnt[2]); printf("その他:%d\n",cnt[3]); return; } プログラムの訂正や、他にどんなプログラムがあるのか見せてもらいたいです>< ちなみに自分のはflgを立てるやり方なのですが、エラーが・・・・。

みんなの回答

  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.7

>ちなみに自分のはflgを立てるやり方なのですが、エラーが・・・・。 フラグの使い方が、ループの終了と文字の判定に使いまわされているせいで ぐちゃぐちゃになっています。 isxxxx関数は指定文字がチェックに引っ掛かる場合 「真」を返すので、そのままif文の条件式に使用することができます。 あえてフラグを使用するなら。。。 ※全角スペースは半角スペースかタブに変換してください。 #include <stdio.h> #include <ctype.h> void main( void ) {  char moji[]="AB$c5kDp9#s*Gz";  int cnt[4] = { 0, 0, 0, 0 };  int i = 0, flag;  while( moji[i]!='\0')  {   if( isupper(moji[i]) )  flag = 0;   else if( islower(moji[i]) ) flag = 1;   else if( isdigit(moji[i]) ) flag = 2;   else      flag = 3;   cnt[flag]++;   i++;  }  printf( "英大文字:%d\n", cnt[0] );  printf( "英小文字:%d\n", cnt[1] );  printf( "数字文字:%d\n", cnt[2] );  printf( "その他:%d\n", cnt[3] );  return; }

回答No.6

では、他の例を。 このやり方の利点は、isupper でカウントアップしている変数と、「大文字」で表示している変数が確かに一致しているという点の確認が容易なところです。 #include <stdio.h> #include <ctype.h> void main(void) { char moji[]="AB$c5kDp9#s*Gz"; int cnt[4]={0}; int cPos; int i; struct { int (*funcCtype)(int); char *outFormat; } checkList[] = { {isupper, "英大文字:%d\n"}, {islower, "英小文字:%d\n"}, {isdigit, "数字文字:%d\n"}, {0, "その他:%d\n"}, {0, 0} }; for(cPos = 0; moji[cPos]; cPos++) { for (i = 0; checkList[i].outFormat; i++) { if ((checkList[i].funcCtype == 0) || checkList[i].funcCtype(moji[cPos])) { cnt[i]++; break; } } } for(i = 0; checkList[i].outFormat; i++) printf(checkList[i].outFormat, cnt[i]); return 0; }

  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.5

#include <stdio.h> #include <ctype.h> void main(void) { char moji[]="AB$c5kDp9#s*Gz"; int cnt[4]={0,0,0,0},flg,i; i=0; while(moji[i]!='\0') { if(isupper(moji[i])) cnt[0]++; else if(islower(moji[i])) cnt[1]++; else if(isdigit(moji[i])) cnt[2]++; else cnt[3]++; i++; } printf("英大文字:%d\n",cnt[0]); printf("英小文字:%d\n",cnt[1]); printf("数字文字:%d\n",cnt[2]); printf("その他:%d\n",cnt[3]); return; }

noname#166246
noname#166246
回答No.4

・cnt[]はそれぞれの文字種別をカウントしていくものなので、 他の用途には使わないようにします。 ・flagの用途が色々あって何したいのか分かりません。 文字列の終わりを示したいのか、関数の返り値を入れたいのか。 用途を分けましょう。cntと同様、他の用途といっしょになっています。 ・if文を、else ifでつなげていくようにしないと、 最後のifのelseに多くのものが入りすぎます。 。。。 直してみました。 直しているうちに、flagが必要なくなってしまいましたが。 #include <stdio.h> #include <ctype.h> void main(void) { char moji[]="AB$c5kDp9#s*Gz"; int cnt[4]={0,0,0,0}; int ichi=0; while(moji[ichi]!='\0') { if(isupper(moji[ichi])) { cnt[0]++; } else if(islower(moji[ichi])) { cnt[1]++; } else if(isdigit(moji[ichi])) { cnt[2]++; } else { cnt[3]++; } ichi++; } printf("英大文字:%d\n",cnt[0]); printf("英小文字:%d\n",cnt[1]); printf("数字文字:%d\n",cnt[2]); printf("その他:%d\n",cnt[3]); }

回答No.3

追記 cnt を文字列のインデックスとして使おうとしていますが、 int型の配列なので >cnt=0; はエラーになってしまうでしょう。 たとえば、 int index = 0; という変数を使って >moji[cnt] を moji[index] と変更し、 whileの最後でインクリメント(index++;)すれば 変数mojiに入っている配列要素を一つずつ回ることが出来ます。 for文を使ったほうがよりスマートになるかもしれません。 for (index = 0; moji[index] != '\0'; index++) {

回答No.2

まず、flgには初期値を入れていないので何が入っているのか不定の状態です。 ですので最初の >while(flg!='\0') では不定な値との比較になっています。 もっとも文字列の終わりに来たということを判定するのであれば while (moji[cnt] != '\0') で。

回答No.1

ループ文の終了判定の意図がわかりません。 何を持ってwhile文を終了しようとしているのでしょうか? まず最初にflgが初期化されていません。flgに0が入っているとwhile文には入らずに終了します。 while文の中ではisdigit、isupper、islowerの各関数の返り値を入れていますが、これらの返り値は真か偽です。3つの判定を順次行っていますが、3つとも真になることは無いので、どれか2つでは必ず偽になります。C言語では偽の値は0ということになっているので、最後の判定結果が真で無い場合はそのままwhile文を終了してしまいます。 あと、ループ内でcntの値が更新されていないので、cntはずっと0のままです。 また、その他のカウントアップする判定が数字じゃない場合全体になってるので、英字でもその他にカウントされてしまいます。 > flg=flgisdigit(moji[cnt]);  これは単なるタイプミスと思いますが…… 何を持って終了判定すれば良いか、じっくりと考えてください。 その他のカウント方法も。

関連するQ&A