アルファベットのカウント結果

このQ&Aのポイント
  • アルファベットのカウント結果を取得するコードを実装しました。
  • 使用されたアルファベットごとのカウント結果を出力しました。
  • カウント結果は以下の通りです: a: 28 c: 56 e: 84 g: 112 i: 140 k: 168 m: 196 o: 224 q: 252 s: 280 u: 308 w: 336 y: 364 {: 392
回答を見る
  • ベストアンサー

C アルファベットのカウント

#include<stdio.h> #define N 97 #define M 122 int main(void) { char str[ ]="national university"; int i,h,count; char check; for(h=N-1;h<=M;h++){ h++; char check = (char)h; for(i=0;str[i] != '\0';i++){ if(str[i] = check){ count++; } } printf("%c:%d\n",check,count); } } というコードで、アルファベットをそれぞれ何文字使用しているか調べるつもりだったのですが、結果は次のようになってしまいました。解説お願いします。 a:28 c:56 e:84 g:112 i:140 k:168 m:196 o:224 q:252 s:280 u:308 w:336 y:364 {:392

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

まともに読んでないけど > for(h=N-1;h<=M;h++){ > > h++; forの宣言部でh++して、for文の中でもh++してるから、 2ずつカウントアップしていくけど良いの? a→c→e→gってチェックしちゃう > char str[ ]="national university"; これ、19個の配列作ってて、20個目がnullとは限らないけど? その結果 > for(i=0;str[i] != '\0';i++){ このループが文字数を超えていて、28回ループしてるね。 > if(str[i] = check){ ==(比較)ではなく =(代入)になってるから 代入した上で、代入した値が0以外だったらtrueって意味になっちゃってるよ? なので、28回(iのループ回数)count++してる。 countをクリアしていないから、累積されてっちゃうよ? なので、 28: 28 56: 28+28 84: 28+28+28

msnaruo
質問者

補足

ありがとうございます!したかったことはできるようになりました。 しかし、ご指摘のループがよくわかりません。 19個の配列作ってて、20個目がnullとは限らない→28回ループ というのが・・?

その他の回答 (4)

回答No.5

count初期化してないのが原因でしたか、失礼。 \0ついたと思ったけど、28回もループしてるみたいだから、 余計な勘繰りしました。 って、あれ?じゃぁ2週目のチェックで+28されてるんだろう?

回答No.4

> > char str[ ]="national university"; > これ、19個の配列作ってて、20個目がnullとは限らないけど? についてだけ。 CやC++では、"" で囲んだ文字列リテラルには、暗黙のうちに、'\0' が付加されます。 また、もともと、 char str[ ] = "national university" は、char 配列を文字列リテラルで初期化するための、シンタックスシュガーで、 意味するところは、 char str[] = {'n', 'a', 't', 'i', 'o', 'n', 'a', 'l', ' ', 'u', 'n', 'i', 'v', 'e', 'r', 's', 'i', 't', 'y', '\0} (最後の '\0' は暗黙に付加されたもの) になります。 なので、str[19] は、'\0' になります。

  • jjon-com
  • ベストアンサー率61% (1599/2592)
回答No.3
  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.2

>> char str[ ]="national university"; >これ、19個の配列作ってて、20個目がnullとは限らないけど? sizeof(str)は20になるハズですが……。 とりあえず、 countが未初期化だったり、1段目のループでクリアしていないから累積されている…のは確かです。 で… >if(str[i] = check){ の箇所でstr[]を破壊しているのも確かです。 すべてのループが終わった後で printf("%s",str) とでもすれば、ステキに書き換え終わった内容が確認できるでしょう。 >したかったことはできるようになりました。 指摘部分修正して、正常動作するようになった…ということですかね? それでも… >#define N 97 >#define M 122 というマジックナンバー使うのはどうかと思いますが。 for(h=N-1;h<=M;h++){ なぜ-1が??

関連するQ&A

  • C言語文字数4つカウント

    こんにちは。大学の課題で「キーボードから入力した文字数に含まれる'h''o''g''e'の4つの文字数をカウントする関数を含むプログラムを完成させよ」という課題がありました。なかなかできず現段階では以下のようになっています。どうすれば問題文のように実行できますか? #include <stdio.h> char str_chnum(const char str[], int ch) { int count = 0; int i; for(i = 0; str[i] != '\0'; i++) { if(str[i] == ch) count++; } return(count); } int main(void) { char str[128]; int ch; printf("文字列を入力してください:"); scanf("%s", str); printf("検索する文字を入力してください:"); scanf(" %c", &ch); printf("%cは%d個ありました。\n", ch, str_chnum(str, ch)); return(0); }

  • C言語 文字列の操作

    文字Cが含まれる個数を求めたいです #include <stdio.h> int str_chnum(const char str[],int c) { int i; int count=0; for(i=0;str[i]!="\0";i++) if (str[i]==c) count++; return(count); } int main(void) { char st[100]; printf("検索文字列を入力してください:"); scanf("%s",st) ; printf("検索文字列数は%uです。\n",st,int str_chnum(const str[],int c)); return(0); } コンパイルできません。なぜですか?printfの行がたぶん間違っていると思うんですが。。。

  • C言語の初心者です。教えてください

    #include<stdio.h> #define NAME 4 void main() { char str[NAME]; int i; for (i = 0;i < NAME;i++){ scanf("%s", &str[i]); } for(i = 0; i < NAME;i++){ printf("%s\n", str[i]); } } どこか間違っているのですか?それとも何か足りないのでしょうか? お願いします。

  • 加算、減算、乗算、除算について

    // 加算、減算、乗算、除算について // 記号と数値にそれぞれ別の配列に分けました。 // そこから、どうすれば計算ができるのか // 悩んでいます。よろしくお願いします。 #include<iostream> using namespace std; char **tokei(char *str1,char *str2,int *count,char *kigouX); int main() { int count; int *num; char **www; char kigo[12]; char str1[30],str2[]="+-*/"; strcpy(str1,"123+45-6*789/"); www=tokei(str1,str2,&count,kigo); num=new int[count]; for(int n=0;n<count;n++) { num[n]=atoi(www[n]); } // 数値に変換num[]、記号を順番に抽出kigo[] -->OK // 記号に沿って、数値を演算すればよい。 // ここがやり方(理屈)がわからない。 getchar();{}return 0; } char **tokei(char *str1,char *str2,int *count,char *kigouX) { int cnt=0; int m=0; for(int a=0;*(str1+a)!='\0';a++){} for(int b=0;*(str2+b)!='\0';b++){} for(int i=0;i<a;i++) { for(int j=0;j<b;j++) { if(*(str1+i)==*(str2+j)) { *(kigouX+m)=*(str1+i);m++; *(str1+i)='\0'; cnt++; } } } *(kigouX+m)='\0'; char **c; c=new char*[cnt]; *count=cnt; for(int m=0;m<cnt;m++) { c[m]=str1; while(*str1!='\0'){str1++;}str1++; } return c; }

  • cプログラミングについて

    以下はsample.txtというファイルを読み込み、辞書順に並べるプログラミングですが、どう正しく 直したらよいかわかりません。間違っている場所を指摘していただけたらと思います。 (間違えだらけで申し訳ありません) #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXLINE 500 void mysort(char *word[MAXLINE]) { int i,j; char *tmp; for(i=0;;i++){ for(j=i+1;; j++){ if(strcmp(word[j],word[i])==1){ tmp=word[i]; word[i]=word[j]; word[j]=tmp; } } } } int main(void) { int i; FILE *fp; char str[MAXLINE]; fp= fopen("sample.txt", "r"); if (fp == NULL) { printf("fopen error\n"); exit(1); } while(( fgets( str, MAXLINE, fp )) != NULL) mysort(str); for(i=0;; i++) printf("%s\n", str[i]); return 0; }

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

    任意の入力された文字列に対し、出現頻度の表示をしようと思って以下のように考えました。 #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週間くらいなので問題点を解決できません。どなたか教えてください。よろしくお願いします。

  • アルファベットを入力するとすべてのアルファベットを小文字に変換して出力

    アルファベットを入力するとすべてのアルファベットを小文字に変換して出力するプログラムを作成しました。2度以上同じ処理を行う場合はその部分を関数としなければいけないのですが、実行結果のように出力できませんでした。。どこが間違っているのでしょうか? 実行結果↓ ************ AOmori ==>aomori iwate ==>iwate AKITA ==>akita ************ #include <stdio.h> #include <string.h> #include <ctype.h> int henkan(void); int main(void) { char str[100]; int j,len; for(j=0;j<6;j++){ gets(str); printf("==>"); } henkan(); return 0; } int henkan(void) { char str[100]; int i, chk,len; for(i=0;i<len;i++){ chk=isupper(str[i]); if(chk!=0)str[i]=tolower(str[i]); { printf("%c",str[i]); } } printf("\n"); return chk; }

  • C言語の、ポインターの問題を教えて下さい

    C言語の、ポインターを使って大文字と小文字を入れ替えるプログラムを教えて下さい。 作ったのですが、うまくいかず困っています。 分かる方、訂正してください。 よろしくお願いいたします。 #include<stdio.h> void reverse(char *str) { int i; for(i=0;str[i]!='\0';i++) { if(str[i]>=0x61) {str[i]-0x20;} if(0x40<str[i]<0x5B) {str[i]+0x20;} } return(str); } int main(void) { int num; char *str="AddsssEEEEwwwJojoHoih"; printf("Before reverse %s \n",str) str=reverse(str); printf("After reverse %s \n",str); return 0; }

  • C言語 初心者です。

    今、英単語帳を作っているのですが、以下のソースではできません。 作ろうとしているプログラムは、a bを登録した場合、次がaabと来たら、 a aab bといったようにしたいのですが、できません。教えてください。 #include <stdio.h> #include <string.h> #define NUMBER 50 /*--- 単語帳の構造体*/ typedef struct { char *word; } words; /*--- 文字列strから文字列wordを検索する ---*/ char *str_chr(const char *str, int w) { for ( ; *str; *str++){ if (*str == w){ return ((char *)str); } } return (NULL); /*検索したが該当しないときはNULLを返す*/ } /*--- 単純交換ソート ---*/ void swap(int *x, int *y) { int temp = *x; *x = *y; *y = temp; } /*--- 配列dataの先頭n個の要素を昇順にソート ---*/ void sort(words data[], int n) { int k = n - 1; while (k >= 0){ int i, j; for (i = 1, j = -1; i <= k; i++) if (data[i - 1].word > data[i].word){ j = i - 1; swap(&data[i], &data[j]); } k = j; } } int main(void) { words word[NUMBER][20] = {{0},{0}}; char str[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; char w[128], *p; int count = 0; do{ printf("単語を入力してください。:"); /*単語を入力する*/ scanf("%s", w); p = str_chr(str, w); }while(p == NULL); count++; if(count >= NUMBER){ /*登録件数を調べる*/ printf("件数いっぱいです。\n"); } return (0); sort(word, NUMBER); return (0); }

  • c++

    /* char03*/ #include<stdio.h> int main() { char i; for(i='!';i<='~';i++){ printf(%3d(0x%2X)--%c",i,i,i); if((1-'!'+1)%4==0 printf("\n") } printf("\n") return("\n") return 0; } if((1-'!'+1)%4==0はどういう意味でしょうか

専門家に質問してみよう