• 締切済み

C言語 例題01

例題にもかかわらず全く分かりません。 どうか教えてください。 これから課題を解くのに、困っています。 入力をEOFまで文字を読込、英小文字、英大文字、数字、空白文字、全文字数を出力するprogramを下記を必ず用いて完成させよう。 * ctype.h をinlcudeし,文字の判定には以下の関数を使おう。 関数 説明 int islower(int c) 文字cが小文字かどうかを調べる int isupper(int c) 文字cが大文字かどうかを調べる int isdigit(int c) 文字cが数字('0'~'9')かどうかを調べる       int isspace(int c) 文字cが空白文字(' ', '\n', '\t'など)か どうかを調べる

みんなの回答

  • Nereus
  • ベストアンサー率45% (17/37)
回答No.1

is***系の関数は、当該文字であった場合に非0を返します。 使いなれると便利ですので、ぜひ覚えてください。 サンプルプログラムを示します。 #include <ctype.h> #include <stdio.h> void check_buf(char* buf) {   int lower = 0, upper = 0;   int digit = 0, space = 0;   int other = 0;   for (; *buf; buf++) {     if (islower(*buf)) // 小文字か?       lower++;     else if (isupper(*buf)) // 大文字か?       upper++;     else if (isdigit(*buf)) // 数字か?       digit++;     else if (isspace(*buf)) // 空白文字か?       space++;     else          // 念のため       other++;   }   printf("英小文字: %d, 英大文字: %d, 数字: %d, 空白文字: %d\n",   lower, upper, digit, space);   printf("全文字数: %d\n", lower + upper + digit + space + other); } int main(void) {   char buf[1024];   printf("文字列を入力してください\n");   fgets(buf, 1024, stdin); // 標準入力から1023文字まで入力   check_buf(buf);   return (0); }

sirouto1
質問者

お礼

本当に助かりました。例題の問題が分からなく,本題(問)に取り組む ことが出来ずに困っていたので,本当に助かりました。ありがとうご ざいます。私もがんばって使えるようにしていきたいと思います。 本当にありがとうございます。

関連するQ&A

  • C言語の<ctype.h>のisspace()について教えてください。

    C言語の<ctype.h>のisspace()について教えてください。 まだ初心者なので、変な質問でしたらすみません。 ライブラリで用意されているisspace()関数があります。 空白類の文字判定を行えるとあり、引数はint型で指定することになっています。 そこで疑問なのですが文字列をgetcで取ってきた時にcはEOFの時にマイナスを取るわけですが、問題ないのでしょうか? 例えば int c; while( !isspace( c = getc( fp )) && c != EOF ){・・・ getcを(unsigned char)ででもキャストすると解消するとは思いますが、問題ないのならば加えたくありません・・。以上ですが、分かりにくい説明でご迷惑おかけします。 よろしくお願い致します。

  • 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を立てるやり方なのですが、エラーが・・・・。

  • C言語のプログラムみてください(isdigit)

    質問は2つあります。 (1) scanf関数を使って、 時給: と表示されたところに一文字打ち込み、数字以外ならばもう一度 時給: と表示されるプログラムを作りたいです。 以下のプログラムなら、 isdigit関数は数字を渡せば0以外の数を返す(真)から、 while文の条件式(偽)のようにすれば、 ・数字を一文字うちこめばwhile文の条件式にあてはまらない、すなわち下のプログラムではisdigit(payment) != 0 となり、return 0; が実行され、プログラムが終わる ・数字以外を一文字打ち込めばwhile文の条件式が真となり、printf関数とscanf関数が実行されて入力待ち状態になる と思ったのですが、どうやら違うようです。実際には ・数字一文字打てばまた入力待ちになる ・数字以外を一文字打てば永遠にprintf関数とscanf関数が実行される のはなぜでしょうか。 #include <stdio.h> #include <ctype.h> int main(void){ int payment; do{ printf("時給[円]:"); scanf("%d",&payment); } while (isdigit(payment) ==0) ; return 0; } (2) 実際には、一文字の制限なく、数字以外の何かを入力したら、再び入力待ちになるプログラムを作りたいのですが、これはどうしたらいいのでしょうか。 つまり 時給: のところに数字以外ならまた 時給: となるようにしたいのです。お願いします。

  • C言語です。よろしくお願いします

    何をすればいいのかがさっぱりです 文字列を入力 入力された文字列について 次の(1)~(6)のすべてを表示するプログラムを作成 (1) 全文字の合計文字数 (2) 数字の文字数 (3) 英大文字の文字数 (4) 英小文字の文字数 (5) 空白の文字数 (6) その他の文字の文字数 データの読み込みはgetchar 関数を使用 実行例 total = (1) numeric= (2) large = (3) small = (4) space = (5) other = (1)-(2)(3)(4)(5) よろしくお願いします

  • 言語の入門用例題を教えて下さい

    あなたの持っている言語の本に書いてある入門用プログラムの例題を教えて下さい。 例えば、K&Rの第1章に載っている入門用プログラムは以下の8つである。 1.hellow world 2.摂氏と華氏の変換 3.ファイルの複写 4.文字のカウント 5.単語のカウント 6.数字と空白文字とその他の文字の出現回数のカウント 7.ベキ乗の計算 8.1番長い行をプリントする 浦昭二編の「Fortran77入門」には以下の入門用の4つの例題プログラムが載っている。 1.電気料金の計算 2.整数の加減乗除 3.台形の面積 4.複利計算 このように、C言語以外の言語でもOKですが、あなたの持っている言語の入門用の本に書いてある入門用プログラムの例題と演習問題を教えて下さい。 よろしくお願いします。

  • C言語のisdigit関数を使った問題です。バッファ読み捨てがよく解りません。

    5文字以内の入力文字を数字のみか文字が含まれているかで表示を変えたいです。main関数内では判定結果のみを表示して、文字列への文字の格納にはfgetsとgetcharを使い、副関数の引数はポインタ型のものを使い、判断は副関数内で行いその戻り値でmain関数で表示を分岐させます。副関数でwhileとisdigit関数の組み合わせ方と、戻り値の選択のやり方が解りません。どなたか詳しい方ぜひ教えていただければと思います。

  • C言語 コンパイルできるが実行するとエラー

    非負の数字を入力してもらい表示させ、数字以外を入力した場合は終了するプログラムです↓(VC使用) ━━━━━━━━━━━━━━━━━━━━━━━━━━ #include "stdafx.h" #include <stdio.h> #include <stdlib.h> /* atoi使用 */ #include <ctype.h> /* isdigit使用 */ int main(void) {   char cx;   int nx;   printf("非負の整数を入力してください。:");   scanf("%s", cx);   if(isdigit(cx) == 0){     printf("数字を入れてください。\n");   }else{     nx = atoi((const char*) cx);   }   printf("%d", nx);   return 0; } ━━━━━━━━━━━━━━━━━━━━━━━━━━ 実行し文字を入力するとDebug Error!と小窓がでます。どこがおかしいのでしょうか?

  • 標準ライブラリ関数と標準入力を使ったプログラミング

    C言語で「入力された数字をASCIIコードとして文字で出力する」というプログラムを作っています。 isdigitを使って入力が数字だったら値を出力して、それ以外のときはエラーメッセージが出力されるようにしたいのですが上手く動作しません。 以下が作ったプログラムなのですが。 #include<stdio.h> #include<ctype.h> int main(void) { int=a; scanf("%d",&a); if(isdigit(a))printf("%c",a); else printf("エラーです"); return 0; } isdigitの使い方がいまいちよく分かってないのともしかしたら根本的に何か大きく違ってるのかもしれないのですが何か助言等あれば頂きたいので宜しくお願いいたします。

  • 大文字を小文字に変換するプログラム

    if((fp4 = fopen("sample.txt","r")) == NULL){ printf("can't open\n"); return(-1);//強制終了 } else{ while((c=fgetc(fp4))!=EOF){/*EOFまでfp4に入力*/ if(isupper(c)){ c=tolower(c); printf("%s",c); } else printf("a"); //確認用 } } ファイルから文字を読み込んでctype関数を使って大文字から小文字に変換したいんですがうまくいきません。 コンパイルしても確認用が反応しないんでおそらくどこか間違ってると思うんですがわかりません。 ご教授宜しくお願いします。

  • 文字カウンタ

    英語の文章中で、二文字単位で読み取って、その文字列の数を出力しようと思っています。 例 hello hey you → he:2 ll:1 o :1 y :1 yo:1 u :1 解析に用いるのは、C言語でなくても、エクセルでもUNIXコマンドでも構いませんが、とりあえず、文字をカウントしたいです。 C言語での文字カウンタを作ってみたのですが、一文字単位で読みとるものしか作れませんでした。 #include <stdio.h> #include <ctype.h> int main( void ) { int ch, i; int alpcnt[26] = {0}; printf( "文字を入力\n" ); while ( ( ch = getchar( ) ) != EOF ) { if ( isupper( ch ) != 0 ) { alpcnt[ch-'A']++; } else if ( islower( ch ) != 0 ) { alpcnt[ch-'a']++; } } for ( i = 0;i < 26; i++ ) { printf( "%c : %3d個入力\t\t", 'a'+i, alpcnt[i] ); if ( i%3 == 2 ) putchar( '\n' ); } return 0; } これを少し改造するだけで作れますでしょうか? 宜しくお願いします。