訳あって、各文字の出現回数を測定するプログラム(C)を書いた。
訳あって、各文字の出現回数を測定するプログラムをC言語で書きました。
(こういう処理ってどういう名前がついてるなの…? word countであってるなの…?)
プログラムを書くにあたって、二通りに場合分けをしました。 一つは0回以上出現した文字だけを測定して出力する場合、 もう一つは任意の文字だけを測定する場合。
まずは0回以上登場した文字だけを測定して出力するプログラム。
#include <stdio.h> #include <math.h> int main() { size_t size = pow(2, 8); // 1byte = 2^8bit int word_counts[size]; char c; int i; // 初期化 for (i=0; i<size; i++) { word_counts[i] = 0; } // 文字数をカウント while(scanf("%c", &c)!=EOF) { if (c == '\n') continue; // 改行は無視 if (c == ' ') continue; // スペースは無視 word_counts[c]++; } // カウントが1以上の文字のみ出力(文字 カウント) for(i=0; i<size; i++) { if(word_counts[i]==0) continue; printf("%c %d\n", (char)i, word_counts[i]); } return 1; }
次に任意の文字の出現回数を測定するプログラム。
#include <stdio.h> #include <string.h> #include <stdlib.h> char *template = "abcdefghijklmnopqrstuvwxyg0123456789" int main() { size_t size = strlen(template); // templateの文字数 int word_counts[size]; char c; char *str; int i; int index; // 初期化 for (i=0; i<size; i++) { word_counts[i] = 0; } // 文字数をカウント while(scanf("%c", &c)!=EOF) { str = strchr(template, c); if(str==NULL) continue; // cで指定した文字が見つからなかったら次の文字へ index = size - strlen(str); word_counts[index]++; } // templateとword_countsを対応付けて出力(文字 カウント) for(i=0; i<size; i++) { printf("%c %d\n", template[i], word_counts[i]); } return 1; }
前者は後者よりもメモリを多く使う代わりに高速。
後者は前者よりも遅いが、使用するメモリ領域が少ない。