こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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);
}

投稿日時 - 2010-01-25 23:33:03

QNo.5623377

困ってます

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

>例えば、「I like sport」 だったら3ワード

ワードの区切り文字が、例えば' '(空白)、タブ、
ピリオド、'\n'(改行)といった文字であるとします。

ワード数を数えるには、文字列を1文字ずつ走査していき、
区切り文字に出会うたびに1ずつ増やしていけばよいでしょう。

文字列終端の'\0'に到達したらワード数を無条件に1増やす、
という処理が必要かもしれません。

投稿日時 - 2010-01-26 07:33:24

お礼

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

投稿日時 - 2010-01-27 11:59:39

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.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;
}

投稿日時 - 2010-01-27 07:51:08

お礼

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

投稿日時 - 2010-01-27 12:02:11

ANo.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;
}

投稿日時 - 2010-01-26 01:18:14

お礼

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

投稿日時 - 2010-01-27 11:57:16

ANo.1

実装例を挙げれば

十分な大きさの配列を用意する。
その配列にファイルのデータを全て格納する。
スペースとかピリオドとかが何個で…など、ワード数をどうやって数えられるかアルゴリズムを考えて、その方法でデータを分析する。

おそらくデータ全体を一個ずつ走査することになると思うので、

for (i = 0; i < データのサイズ; ++i) {
if (データの入った配列[i] == " ") カウント増やす
}

とかそんな感じになるかと。

投稿日時 - 2010-01-25 23:47:46

お礼

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

投稿日時 - 2010-01-27 11:55:15

あなたにオススメの質問