- ベストアンサー
C言語のプログラム:文字列のアルファベット判定と出現回数の表示
- 次のようなプログラムを作成しようと考えています。文字列を入力し、入力した文字列にアルファベット以外の文字が含まれていたら再入力します。"end"もしくは"END"が入力されたらプログラム終了します。また、main関数とは別の関数で入力した文字列に現れる文字を全て入力順に大文字で表示します(小文字と大文字は同じ文字として扱い、出現個数も合わせて表示します)。3.では入力順に表示させていたが、アルファベット順に結果を表示することもできます。
- 上記の2.までのプログラムは作成できたのですが、3.及び応用が分からず大変困っています。どなたかご教授ください。
- プログラムの要件は、文字列のアルファベット判定と出現回数の表示です。プログラムは文字列の入力とアルファベット以外の文字の判定、プログラム終了の処理、出現文字の大文字変換、出現回数のカウントなどが必要です。入力した文字列は配列に格納し、ループ処理を使用してアルファベット以外の文字の判定を行います。文字の判定にはASCIIコードを使用します。文字列の長さを求めるにはstrlen関数を使用します。出現文字の大文字変換には小文字を大文字に変換する処理を使用します。出現回数のカウントには文字ごとに変数を用意してカウントします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
#if 0 表示結果例) 入力:DxbhzAeFSXY 出力:D=1,X=2,B=1,H=1,Z=1,A=1,E=1,F=1,S=1,Y=1 出力が D=1,X=2,B=1,H=1,Z=1,A=1,E=1,F=1,S=1,X=2,Y=1 になるので仕様と違うが、その他は、概ね良いと思われるサンプル #endif #include <stdio.h> #include <string.h> #include <ctype.h> void count(char *str){ int c[26]; // A-Z int i; char *p; for(i=0;i<26;i++) c[i]=0; // 0 で初期化 for(p=str ; *p ; p++) //文字列を走査 c[toupper(*p)-'A']++; // A-Z カウント for(p=str ; *p ; p++) //出現順に表示 printf("%c=%d%s",toupper(*p),c[toupper(*p)-'A'],(*(p+1)=='\0')? "\n" : ","); for(i=0 ; i<26 ; i++) //アルファベット順に表示 if(c[i]) printf("%c=%d%s",'A'+i,c[i],(i==25)? "\n" : ","); } int main(void){ char ss[80]; char *sa[2]={"end","END"}; char *p; int flag; //アルファベット以外の入力があった際の判別 do{ printf("文字列を入力してください\n"); gets(ss); if(strcmp(ss,sa[0])==0 || strcmp(ss,sa[1])==0){ //endまたはENDの判定 break; } for(flag=0,p=ss; *p; p++){ if(!isalpha(*p)){ flag=1; break; } } if(flag==0) count(ss); }while(1); return 0; }
その他の回答 (1)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
>ポインタを使用していないプログラムもご教授いただけないでしょうか? ええっ~~~~~! だって、 printfだって strcmpだって getsだって ポインタ使用していますよ? 閑話休題 p=str *(p+i)はstr[i]と(ほぼ)同じということを頭にいれると 例えば for(p=str ; *p ; p++) //文字列を走査 c[toupper(*p)-'A']++; // A-Z カウント は for(int i=0;str[i];i++) c[toupper(str[i])-'A']++; に置き換えることができます。
お礼
度重なる質問に迅速にお答えいただきまして、ありがとうございます。 ポインタがどのような機能を持っているのか確認した上に、プログラムをしっかりと理解することが出来ました。
お礼
大変ありがとうございます。 ポインタは未修得だったため、非常によい勉強となります。お答えいただいたプログラムを参考に、実装してみます。 できることなら、ポインタを使用していないプログラムもご教授いただけないでしょうか?