• ベストアンサー

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% (2126/6286)
回答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

  • C言語の問題がわかりません。

    C言語の問題がわかりません。 ファイルを読み込んで、文字数と単語数を数えるプログラムなのですが、 例えば、ファイルが 「I was born in Japan  I like baseball」でしたら、 1:I was born in Japan 19文字、5単語 2:I like baseball 15文字、3単語 と表示したいのですが、下記のプログラムのままだと、 1:I was born in Japan 20文字、5単語 2:I like baseball 15文字、3単語 と作った文章の改行の部分を認証してしまいます。 改行の部分を認証しないようにこれを修正するにはどうしたらいいでしょうか? また、もう一つあるのですが、結果の文章を 1:napaJ・・・ 2:・・・ekil I と行ごとに逆に表示したいのですが、どうすれば逆に表示できますでしょうか? #include <stdio.h> #include <string.h> #include <stdlib.h> int main(void) { FILE *fin; char filename[20]; char data[256], *abc; int a,b,n; printf("ファイル名の入力 :"); scanf("%s", filename); fin=fopen(filename,"r"); if(fin == NULL){ printf("%sがオープンできません!\n",filename); exit(1); } a=0; b=0; n=0; while(fgets(data,256,fin) != NULL) { a=a+1; b=strlen(data); abc = data; *(abc - 2) = '\t'; while (*abc == ' ') {abc++;} while (*abc != '\0') { while (*abc != '\0' && !(*abc == ' ' || *abc == '\t' || *abc == ',' || *abc == '.')){abc++;} n = n+1; while (*abc != '\0' && (*abc == ' ' || *abc == '\t' || *abc == ',' || *abc == '.')) {abc++;} } printf("%d:%s\n",a,data); printf("%d文字、%d単語\n",b,n); n=0; } fclose(fin); return 0; }

  • C言語のプログラミングについて教えてください

    課題で下記に示すのようなデータをファイル名を入力してのそのデータを読み込みyの最大値とそのときのxの値を表示するプログラムを作成しろと言われたのですが、僕はプログラミングが初心者でむしろ苦手でホント困ってます。だれか助けてください、お願いします! データ    x  y 0.12132 3.45355 0.12353  3.415451 . . . . . . のようにxとyの行列となっていて、その数は2000個を超えています。 自分なりにやってみたのですがデータをすべて読み込まないし、まずどのようにして、yの最大値をだし、なおかつそのxの値を表示させるのもわかんなくてホント困っています。 本末転倒になりますが、プログラムを書いていただけるとほんと助かります。よろしくお願いいたします。 ちなみにこれが自分で考えたプログラムです。とりあえず、yの値がでかいのでyの最大値だけだすつもりでやってみたけど駄目でした。 #include <stdio.h> #include <stdlib.h> int main(void) { FILE *fin; char *list[256]; char buf[1024]; char filename1[80]; printf("入力ファイル名"); gets(filename1); fin=fopen(filename1,"r"); if (fin ==NULL) { printf("%sをオープンできません\n",filename1); exit(1); } while (fgets(buf, 1024, fin) !=NULL) { printf("%s",buf); } static float max; int x; fscanf(fin,"%f",&x); if(x>max){ max=x; printf("yの最大値=%f\n",max); } fclose(fin); }

  • このプログラムの解説を

    C言語の勉強を始めたのですが、質問があります。 下のプログラムをコンパイルしたら   入力ファイル名= と出ますが、これは何を入力すればよいのでしょうか? 何か入力しても「~がオープンできません」と表示されて、これは、自分が持っているファイルを打てばよいのですか?(このプログラム自体も何を意味しているか、まだ理解できていません。) 解説よろしくお願いします。 #include<stdio.h> #include<stdlib.h> main() { FILE *fin; char buf[256]; char filename1[20]; printf("入力ファイル名="); gets(filename1); fin=fopen(filename1,"r"); if(fin==NULL){ printf("%sがオープンできません.\n",filename1); exit(1); } while(fgets(buf,256,fin) !=NULL){ printf("%s",buf); } fclose(fin); }

  • C言語 ファイルの意味

    C言語 文字列で分からない部分があるのでご教示お願いします。 内容は「文字列の検索」です。 #include<stdio.h> #include<string.h> int main(void) { char word[] = "abcabdabe"; char word2[] = "abd"; char *word3 = "ABD"; char *word4 = NULL; printf("処理前の文字列:%s\n", word); word4 = word; word4 = strchr(word4, *word2); while (word4 != NULL){ printf("'a'が見つかった場所からの文字列: %s<\n", word4); if (strncmp(word4, word2, strlen(word2)) == 0) { strncpy(word4, word3, strlen(word3)); } word4 += 1; word4 = strchr(word4, *word2); } printf("処理後のword4: %s\n", word); return 0; } このプログラムの場合、word3とword4ではなぜ、*word3, *word4とポインタで設定するのでしょうか? また、「word4 = strchr(word4, *word2)」と *word2のようにlここでポインタ指定するのは何故なのでしょうか?

  • gccのオプションは必要ですか?

    ubuntuを使ってc言語の勉強(スーパービギナー編ですが)をしています。 以下のプログラムを実行すると、Segmentation faultが出ます。 以前、-lmのオプションを付けないと、math.hが使えない事が、ありましたが、今回の場合、何か必要でしょうか? #include<stdio.h> #include<stdlib.h> int main(void) { FILE *fin; char buf[256]; char filename1[80]; printf("入力ファイル名="); gets("filename1"); fin = fopen(filename1,"r"); if(fin==NULL){ printf("%sをオープンできません。\n",filename1); exit(1); } while(fgets(buf,256,fin) !=NULL){ printf("%s",buf); } fclose(fin); return 0; }

  • C言語のファイル読み込みに関して。

    英文を入力したテキストファイルを読み込むプログラムをつくっているのですが、 ファイル読み込みが上手くできません。 #include<stdio.h> main() { char filename[33]; char sty[512]; FILE *fp; printf("FILENAME: "); fgets(filename, 33, stdin); //読み込むテキストファイルを指定 fp = fopen(filename,"r"); if(fp == NULL){ printf("Can't open the file!\n"); return -1; } fgets(sty, 512, fp); fclose(fp); printf("%s\n",sty); } このプログラムなのですが、どうしても"Can't open the file!"が表示されてしまいます。 どうすればいいのでしょうか?

  • C言語でファイルから特定の文字を抽出

    現在C言語でプログラム開発しています。 文字列が並んだテキストファイルから特定の部分のみを抽出したいのですが、うまくいきません。 お力を貸していただけないでしょうか。 テキストファイルの構造はこんな感じです。 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー 文字列 文字列 文字列badresult=*****文字列badresult=*****文字列badresult=*****文字列result=***** ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー これが10セット程記述されたファイルです。 ここから全てのbadresultの数値とresultの数値を抽出したいのです。 私が現段階で作成したプログラムがこちらです。 #include <stdio.h> #include <string.h> #include <stdlib.h> #define MAXLINE 2084 int main(void){ FILE *fp; char line[MAXLINE]; char s1[]="badresult"; char s2[]="result="; char *r; if ((fp = fopen( "テキストファイルへのダイレクトパス", "r" )) == NULL){ printf("エラーメッセージB\n"); exit(1); } while (fgets(line, MAXLINE, fp) != NULL){ if(strstr(line,s1)!=NULL){ printf("%.27s",strstr(line, s1),"\n"); printf(" "); printf(strstr(line, s2)); } } } ですがこれだと1行に全てのbadresultが含まれているため、結果は ----------------------------- badresult=***** result=****** ----------------------------- とbadresultは1つしか出てきません。 strstrのポインタをどうにかできないかと考えたのですが、 私のC言語の知識も浅いためなかなかうまくできません。 Cプログラミングに精通している方、どうか改善策を教えていただけないでしょうか。 できればなるべく簡単な方法ですと助かります。

  • C言語で困っています...[文字数のカウント]

    C言語で困っているので教えていただきたいです。 ファイルのデータ(英文)を読み込み、一行毎の文字数(スペースも含む)とワード数を数えるプログラムを作成しています。 ワード数を数えることはできたのですが、文字数をどのように数えればよいかわかりません。 while文の後にif文でワード数を数えるようにしたので、同様に文字数も数えようとしましたが、 ( )内に何を入れるべきかで行き詰まりました。 バイト数を数えるようにすればよいのだろうとは思ったのですが...、 また、3行ある英文を読み込むのですが、 このままのプログラムだと3行全体でのワード数を求めるようになってしまっています。 1行ごとに文字数、ワード数を表示するにはどうしたらよいのでしょうか? ちなみにbcc developerを使っています。 どなたか、よろしくお願いします。 /* ファイルのデータ(英文)を読み込み、    一行毎の文字数(スペースも含む)とワード数を数える */ #include<stdio.h> int main(void){ char filename[20]; printf("ファイル名を入力してください:"); scanf("%s",filename);/*ファイルの名前を指定*/ FILE *f; int c; int j=0,k=0; f=fopen(filename,"r");/*ファイルを開く*/ if(f==NULL){ printf("%sがオープンできません!\n",filename); return 1; } while((c=fgetc(f))!=EOF){ if(c==' '||c=='\n') j++; } k=k+1; printf("⇒%d文字、%dワード\n",k,j); fclose(f);/*ファイルを閉じる*/ return 0; }

  • C言語 教えてください

    data.txtの中に入っているデータを読み込み、 全て出力するというプログラムを作ろうとしています。 しかし、上手く読み込み表示させることが出来ません。 自分で出来るだけ調べたのですが、 どこがおかしいのかわからないので教えてください。 ↓↓↓現在作っているプログラムです↓↓↓ #include <stdio.h> void main(void) { FILE *fp; char number, name; if ((fp = fopen("data.txt", "r")) == NULL) { printf("FILE OPEN ERROR\n"); } else { while (fscanf(fp, "%s%s", number, name) == 2) { printf("%s-%s\n", number, name); } } fclose(fp); printf("FILE CLOSE !!\n"); } ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ ↓↓data.txt↓↓ 001 aaa 002 bbb 003 ccc 004 ddd 005 eee ↑↑↑↑↑↑↑↑ よろしくお願いします。

  • C言語

    (a) キーボードから入力された文字列をそのままディスプレイに表示するプログラムを作成しなさい。 という問題 #include<stdio.h> main() { char word[1000]; /*文字型の変数の宣言*/ scanf("%s", word); /*キーボードから文字列を入力*/ printf("%s\n", word); /*入力した文字列を出力*/ } と作りましたがこれではコンソール中で文字を打ってからエンターを押さないといけないからといわれ再提出になってしまいました。 エンターを押さないでそのまま出力するということは、できるのでしょうか? あと自分の作ったプログラムではスペースや改行を使うことができないから使えるようにしろと言われてましたがそれわできますか? 変換仕様をかえればいいのですか ほかにもかえる所はありますか?