• ベストアンサー

C言語の問題

選んだファイルのデータを読み取り、そのファイルのデータの中の文字列を数えるプログラム(例えば、「I like sport」 だったら3ワード)を作りたいのですが、文字数を数えるものしかわからないです。 一応、下のプログラムが文字数を数えるものですが、どうすれば文字列を数えるものになりますでしょうか?教えてください。 #include <stdio.h> #include <string.h> #include <stdlib.h> main() { FILE *fin; char filename[20]; char data[256]; int n; printf("ファイル名の入力 :"); gets(filename); fin=fopen(filename,"r"); if(fin == NULL){ printf("%sがオープンできません!\n",filename); exit(1); } while(fgets(data,256,fin) !=NULL){ } n=strlen(data); printf("ファイル %s には、%dワードがあります。\n",filename,n); fclose(fin); }

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

  • ベストアンサー
  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.3

>例えば、「I like sport」 だったら3ワード ワードの区切り文字が、例えば' '(空白)、タブ、 ピリオド、'\n'(改行)といった文字であるとします。 ワード数を数えるには、文字列を1文字ずつ走査していき、 区切り文字に出会うたびに1ずつ増やしていけばよいでしょう。 文字列終端の'\0'に到達したらワード数を無条件に1増やす、 という処理が必要かもしれません。

rarand
質問者

お礼

ありがとうございます。 説明がわかりやすくて理解しやすかったです。

その他の回答 (3)

回答No.4

gccの場合です。 /* Programmed by Mac OSX gcc compiler */ #include <stdio.h> #include <string.h> #include <stdlib.h> int main(void) { FILE *fin; char filename[20]; char data[256], *ptr; int n; printf("ファイル名の入力 :"); scanf("%s", filename); fin=fopen(filename,"r"); if(fin == NULL){ printf("%sがオープンできません!\n",filename); exit(1); } n = 0; while(fgets(data,256,fin) != NULL) { ptr = data; while (*ptr++ != '\0'); *(ptr - 2) = '\0'; // \nを削除(要確認) ptr = data; while (*ptr == ' ' || *ptr == '\t') ptr++; // スキップ while (*ptr != '\0') { while (*ptr != '\0' && !(*ptr == ' ' || *ptr == '\t' || *ptr == ',' || *ptr == '.')) ptr++; n += 1; while (*ptr != '\0' && (*ptr == ' ' || *ptr == '\t' || *ptr == ',' || *ptr == '.')) ptr++; // スキップ } } printf("ファイル %s には、%dワードがあります。\n",filename,n); fclose(fin); return 0; }

rarand
質問者

お礼

ありがとうございます。 わざわざ質問と同じ形式で書いてくださって申し訳ないです。

回答No.2

#include <stdio.h> #include <ctype.h> int main(int argc, char *argv[]) { int c, wcnt = 0, word = 0; FILE *fp; if(argc != 2) return 1; if(!(fp = fopen(argv[1], "r"))) return 1; while((c = fgetc(fp)) != EOF){ if(isalpha(c)){ wcnt += !word; word = 1; } else word = 0; } printf("word %d\n", wcnt); return 0; }

rarand
質問者

お礼

回答ありがとうございます。 自分にはさっぱりのものが出てきましたが、今後学習に活かしたいと思います。

  • LOHA
  • ベストアンサー率52% (203/388)
回答No.1

実装例を挙げれば 十分な大きさの配列を用意する。 その配列にファイルのデータを全て格納する。 スペースとかピリオドとかが何個で…など、ワード数をどうやって数えられるかアルゴリズムを考えて、その方法でデータを分析する。 おそらくデータ全体を一個ずつ走査することになると思うので、 for (i = 0; i < データのサイズ; ++i) { if (データの入った配列[i] == " ") カウント増やす } とかそんな感じになるかと。

rarand
質問者

お礼

ありがとうございます。 自分の知識が少なくて、形式でトラブルになって上手くいきませんでしたが、とても参考になりました。

関連するQ&A