読者です 読者をやめる 読者になる 読者になる

ぶろぐめんどくさい

技術系の記事と漫画レビューが入り混じった混沌

訳あって、各文字の出現回数を測定するプログラム(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;
}

前者は後者よりもメモリを多く使う代わりに高速。

後者は前者よりも遅いが、使用するメモリ領域が少ない。