Announce

PukiWiki contents have been moved into SONOTS Plugin (20070703)

03.wsc.c

ファイル中の単語数、文数を数える (Word Sentence Count)

投稿者s1080134
作成日2000/08 (学部1年前期)
最終更新日2002/12
言語C
行数226
Table of Contents

説明

ファイル中の単語数、文数を数えるプログラムです。 Academic Writing という英語の授業で、単語、文章数を数えるようにいわれていたのですが、 wc コマンドでは文章数を数えてくれないので自分で作成しました。

後記:自主的に作ったプログラム、第一号の記念作です。 楽をするために労力を払うという基本スタンスはこの時にはできていたような気がします。 日本語文のカウントは、プログラムの文字コードとカウントされる文章の文字コードが一致していなければならない組み方であり、まだまだ甘いですね。

書式

使い方は以下のようになっています。

   wsc: Word Sentence Count. (c) s1080134
   Usage: wsc [options] [filename]
          options: -e Count english document. (default)
                   -j Count japanese document.
                   -h Show this usage.

英語モードでは、 .(ドット) or ! or ? の後ろに空白、改行、または EOF があった場合 sentence 数を加算します。会話文などは、"・・・・." とかくのが普通であるそうなので、 ." or !" or ?" でも同様にカウントします。

オプション -j をつけると、日本語文の文字数、文章数をカウントします。 文章数はただ単に。の数です。文字数は空白、改行以外の半角としての文字数/2です。

ソースコード

#include <stdio.h>
#include <string.h>

#define EN 0
#define JP 1
#define WORD 3
int mode=EN;

void printUsage(){
  fprintf(stderr,"wsc: Word Sentence Count. (c) s1080134\n");
  fprintf(stderr,"Usage: wsc [options] [filename]\n");
  fprintf(stderr,"       options: -e Count english document. (default)\n");
  fprintf(stderr,"                -j Count japanese document.\n");
  fprintf(stderr,"                -h Show this usage.\n");
}

void get(char *c,FILE *fp){
  int i=0;
  /* c[1]->c[0],c[2]->c[1]*/
  for(i=0;i<WORD-1;i++){
    c[i]=c[i+1];
  }
  c[WORD-1]=fgetc(fp);
}

int main(int argc, char *argv[]){
  
  char *filename=NULL;
  FILE *fp;
  char c[WORD];

  int word=0;
  int sentence=0;
  /*Options*/
  {
    int i; /* 裏技? */
    for(i=1;i<argc;i++){
      if(strcmp(argv[i],"-e")==0){
	mode=EN;
      }
      else if(strcmp(argv[i],"-j")==0){
	mode=JP;
      }
      else if(strcmp(argv[i],"-h")==0){
	printUsage();
	return 0;
      }
      else if(argv[i][0] == '-'){
	printUsage();
	return 1;
      }
      else{
	filename=argv[i];
      }
    }
  }

  if(filename == NULL){
    fp=stdin;
  }
  else{
    if((fp=fopen(filename,"r"))==NULL){
      printf("File is not found.\n");
      return 2;
    }
  }

  { /* WORD-1 文字格納しておく */
    int i;
    for(i=0;i<WORD-1;i++){
      get(c,fp);
    }
  }

  if(mode==EN){ /* ENGLISH */
    int space=1;
    while(1){
      get(c,fp);
      if(c[0]==EOF){break;}
      if(c[0] == ' ' || c[0] == '\n'){
	space=1;
      }
      else if(space){
	word++;
	space=0;
      }
      else if(c[0]=='.'||c[0]=='!'||c[0]=='?'){
	if(c[1]==' ' || 1[c] == '\n' || 1[c] == EOF){ /* 裏技*/
	  sentence++;
	}
	else if(c[1]=='"'){
	  if(c[2]==' ' || c[2] == '\n' || c[2] == EOF){ 
	    sentence++;
	  }
	}
      }
    }
  }
  else{ /* JAPANESE */
    while(1){
      get(c,fp);
      if(c[0]==EOF){break;}
      if(strncmp("。",c,2)==0){
	sentence++;
      }
      if(!(c[0] == ' ' || c[0] == '\n' || (strncmp(" ",c,2)==0))){
	word++;
      }
    }
    word -= (WORD-1);
    word=word/2;
  }
  
  printf("word: %d  sentence: %d\n",word,sentence);
  return 0;
}