質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Q&A

解決済

4回答

8901閲覧

「C言語」特定の英単語の出現回数を求めたい

prof

総合スコア179

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

0グッド

0クリップ

投稿2020/07/20 12:53

問題

ファイル .txt から文字を読み込み、文章中で単語の "the" が何回出現しているのかをカウントする。ただし、大文字と小文字は区別しない。また、単語中に出現する the、例えば "gather" に含まれる "the" はカウントしない。

会話内容は「"」で囲んで表記される( "The United States ~" など)。発言内容の先頭に出現する "the" はカウントの対象に含めることとする。

###自分で考えた方針
0. まず、fpとしてファイルを読み込む。

  1. 大文字のTをtに統一する。一文字ずつ読み込むことにする。
  2. 次に、アルファベット以外(a,A~z,Z)の「,」「"」「.」などを消すため、NULLとして上書きする。

そうしてできたのをfp2として、theを検知する。
###これ以降わからないです。
自分としては、fscanfで文字列をとってくるにしても、長さがバラバラでとれない?ような感じがします。

ぜひとも、解答のヒントや解答をご教授ください。

#include<stdio.h> #include<string.h> int main(void){ FILE *fp,*fp2; fp = fopen("un.txt","r"); if(fp == NULL){ printf("error\n"); return -1; } else{ puts("file opened"); } //以下が大切 char c; while(fscanf(fp,"%c",&c) != EOF){ //小文字に揃える if('A' <= c && c <= 'Z'){ c = c - ('A' - 'a'); } else if('a' <= c && c <= 'z'){ continue; } //a~z以外をNULL else { c = 0; } fprintf(fp2, "%c", c); } int count = 0; //英単語を文字列に割り当てたい char s[]; while(fscanf(fp2,"%s",s) != EOF){ if(s[0] = 't' && s[1] == 'h' && s[2] == 'e'){ count++; } } printf("%d",count); return 0; }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

1行読んで、記号は空白に、英字は小文字にしてから、両端に空白のある" the "strstrで検索。見つかったらcountを1増やして、さらにstrstrで検索。
先頭の"the "と末尾の" the"(ファイル末尾にあるかも)は別途調べる。

C

1#include <stdio.h> 2#include <string.h> 3#include <ctype.h> 4 5void preprocess(char *ptr); 6 7int main(void) 8{ 9 FILE *fp; 10 char line[4096]; 11 int count = 0; 12 13 fp = fopen("file.txt", "r"); 14 if (fp == NULL) { 15 puts("file not found."); 16 return 1; 17 } 18 while (fgets(line, sizeof(line), fp) != NULL) { 19 preprocess(line); 20 21 char *ptr = strstr(line, " the "); 22 while (ptr != NULL) { 23 count++; 24 ptr = strstr(ptr + 5, " the "); 25 } 26 } 27 28 if (strncmp(line, "the ", 4) == 0) { 29 count++; 30 } 31 if (strncmp(line + strlen(line) - 4, " the", 4) == 0) { 32 count++; 33 } 34 fclose(fp); 35 36 printf("%d\n", count); 37 38 return 0; 39} 40 41void preprocess(char *ptr) 42{ 43 while (*ptr != '\0') { 44 switch (*ptr) { 45 case '"': 46 case ',': 47 case '\'': 48 case '.': 49 case '\n': 50 *ptr = ' '; 51 break; 52 default: 53 *ptr = tolower(*ptr); 54 } 55 ptr++; 56 } 57}

投稿2020/07/20 17:47

Daregada

総合スコア11990

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

prof

2020/07/20 23:52

回答ありがとうございます。 2つほど知らない関数があったので調べつつ理解していきます。 正直、関数を分けたり、" the "と空白をつけて考えるのは自分にとって大きな収穫です。
guest

0

  • fgetsで1行読み込む
  • その1行を大文字変換
  • スペースで分割する
  • 分割した各文字列をTHEと合致するかチェック
  • ファイルが尽きるまで繰り返し

これでコードを組んでいけばいいです

投稿2020/07/20 13:08

y_waiwai

総合スコア87749

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

prof

2020/07/20 13:44

ヒントありがとうございます、やってみます! 文章中において、"The~となるときの対処法は、 分割し終えた文字列の0番目が"(ASCIIで34)かどうかで、場合分けしておけばいけそうでしょうか...
y_waiwai

2020/07/20 13:45

標準関数で、文字列を比較する関数もあります
guest

0

scanf の "%[a-zA-Z]" で単語を読み込むというのはいかがでしょうか?

C

1#include <stdio.h> // fopen, fclose, fscanf, printf, perror 2#include <string.h> // strcmp 3#include <ctype.h> // tolower 4 5int main(void) 6{ 7 FILE *fp = fopen("un.txt", "r"); 8 if (!fp) { perror("un.txt"); return 1; } 9 char word[51]; 10 int count = 0; 11 while (1) { 12 fscanf(fp, "%*[^a-zA-Z]"); // 英字以外を読み飛ばす 13 if (fscanf(fp, "%50[a-zA-Z]", word) != 1) break; // 単語を読む 14 for (int i = 0; word[i]; i++) word[i] = tolower(word[i]); 15 if (strcmp(word, "the") == 0) count++; 16 } 17 fclose(fp); 18 printf("%d\n", count); 19}

投稿2020/07/20 13:42

kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

prof

2020/07/20 13:47

回答ありがとうございます。 "%[a-zA-Z]"  という表記を初めてみました。 まだ基礎学習の段階なので、チートに感じる部分はパスしつつやっていこうとしています。 ひとまず完成したら、回答者様の内容から勉強します。
guest

0

こんなんでどうでしょう。

c

1#include <stdlib.h> 2#include <stdio.h> 3#include <string.h> 4 5int main(void) { 6 FILE *fp; 7 char buf[4]; 8 int len, count; 9 char c; 10 11 fp = fopen("un.txt","r"); 12 if (fp == NULL) { 13 printf("error\n"); 14 return -1; 15 } 16 17 len = 0; 18 while (!feof(fp)) { 19 c = fgetc(fp); 20 if ('A' <= c && c <= 'Z') { 21 c += ('a' - 'A'); 22 if (len <= 3) buf[len] = c; 23 ++len; 24 } else if ('a' <= c && c <= 'z') { 25 if (len <= 3) buf[len] = c; 26 ++len; 27 } else { 28 if (len == 3 && memcmp(buf, "the", 3) == 0) 29 ++count; 30 len = 0; 31 } 32 fprintf(fp2, "%c", c); 33 } 34 35 printf("%d", count); 36}

投稿2020/07/20 13:06

katahiromz

総合スコア186

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問