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

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

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

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

Q&A

解決済

2回答

619閲覧

トライ木に登録された英単語を検索すると, その日本語の意味が出力されるようなプログラムを実装したい

rft3

総合スコア7

C

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

0グッド

0クリップ

投稿2020/07/06 03:56

編集2020/07/09 03:21

トライ木に登録された英単語を検索すると,その日本語の意味が出力されるようなプログラムを実装したいのです。
方針としては、
1.データ読み込み時に、英単語用の配列words、意味用の配列meaningsを格納する
2. Node構造体のメンバに,意味用の文字列char *meaningを追加する
3. 英単語をトライ木にinsertする際,単語の最後の文字に該当する
ノードのメンバに意味を登録(strcpy)する
4.検索ワードをsearchする際,意味を出力する

という流れで行ったのですが思うような結果にならず手詰まりしています。どうかご教授お願いいたします。
実行可能な状態にしてもSegmentation fault (コアダンプ)となってしまいます。

実装したい実行結果
$ ./cpgm/dictionary data/meanings.txt apple
りんご
$ ./cpgm/dictionary data/meanings.txt zzz
zzzは辞書に登録されていません


ソースコード↓

C

1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4 5#define NUM_OF_CHARS 26 6 7typedef struct node Node; 8struct node{ 9 int id; 10 //int freq; 11 char *meaning; 12 Node* next_char[NUM_OF_CHARS]; 13}; 14 15 16Node* create(){ 17 Node* node = (Node*) malloc(sizeof(Node)); 18 node->id = -1; 19 20 for(int i = 0; i < NUM_OF_CHARS; i++) node->next_char[i] = NULL; 21 return node; 22} 23 24void show(Node *curr, char *str, int pos){ 25 if(curr == NULL) return; 26 if(curr->id != -1){ 27 str[pos] = '\0'; 28 printf("%d\t%s\t%d\n", curr->id+1, str, curr->meaning); 29 } 30 for(int i = 0; i < NUM_OF_CHARS; i++){ 31 if(curr->next_char[i] != NULL){ 32 str[pos] = i+'a'; 33 show(curr->next_char[i], str, pos+1); 34 } 35 } 36} 37 38 39void insert(Node *freq, char *str){ 40 static int WID = 0; 41 if(freq == NULL) return; 42 while(*str){ 43 char ch = *str-'a'; 44 if(freq->next_char[ch] == NULL) freq->next_char[ch] = create(); 45 freq = freq->next_char[ch]; 46 str++; 47 } 48 if(freq->id == -1) freq->id = WID++; 49} 50 51 52int search(Node *curr, char *keyword){ 53 if(curr == NULL) return -1; 54 while(*keyword){ 55 char ch = *keyword-'a'; 56 if( (curr = curr->next_char[ch]) == NULL) return -1; 57 keyword++; 58 } 59return curr->id; 60} 61 62 63int N; 64char **words; 65 66void read_text(char *fn){ 67 FILE *fp = fopen(fn, "r"); 68 if (!fp) { perror("fopen"); return; } 69 char str[32]; 70 fscanf(fp, "%d\n", &N); 71 words = (char **) malloc(N*sizeof(char *)); 72 for(int i = 0; i < N; i++){ 73 fgets(str, 32, fp); 74 char *p = strchr(str, '\n'); 75 *p = '\0'; 76 int len = strlen(str); 77 words[i] = (char *) calloc(len+1, sizeof(char)); 78 strcpy(words[i], str); 79 } 80fclose(fp); 81} 82 83int main(int argc, char *argv[]){ 84 read_text(argv[1]); 85 Node* root = create(); 86 for(int i = 0; i < N; i++) insert(root, words[i]); 87 char str[32]; 88 show(root, str, 0); 89} 90

meaning.txtの中身(一部)
1008
hand 手
map 地図
man 男の人
cup カップ
fish 魚
line 線,列
sister 姉妹
watch 腕時計


エラーメッセージ↓
warning: format ‘%d’ expects argument of type ‘int’, but argument 4 has type ‘char *’ [-Wformat=]
printf("%d\t%s\t%d\n", curr->id+1, str,


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

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

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

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

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

kazuma-s

2020/07/06 22:44

data/meanings の内容はどんなものですか? 質問を修正して、先頭の数行でいいから追記してください。
rft3

2020/07/07 05:02

すみません。追記します。
guest

回答2

0

エラーメッセージの通り修正してもコンパイルができず

エラーメッセージ↓
warning: format ‘%d’ expects argument of type ‘int’, but argument 4 has type ‘char *’ [-Wformat=]

diff

1-printf("%d\t%s\t%d\n", curr->id+1, str, curr->meaning); 2+printf("%d\t%s\t%s\n", curr->id+1, str, curr->meaning);

でコンパイルできますよ?


英単語の読み込みだけで、単語の意味の読み込み部分がないようですが…

実装したい実行結果 $ ./cpgm/dictionary data/meanings.txt apple りんご $ ./cpgm/dictionary data/meanings.txt zzz zzzは辞書に登録されていません

とあり、2番目の引数を検索したいのだろうと思いますが、プログラム中でargv[2]を使用していませんよ。
search()も呼んでいませんし、作りかけですか?

投稿2020/07/06 04:04

編集2020/07/06 23:35
SHOMI

総合スコア4079

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

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

rft3

2020/07/06 16:15

すみません。根本的な部分が間違えていました。
guest

0

ベストアンサー

どこが分からなかったのかを詳しく説明してください。

C

1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4 5#define NUM_OF_CHARS 26 6 7typedef struct node Node; 8struct node { 9 int id; 10 //int freq; 11 char *meaning; // ★ (2) 12 Node *next_char[NUM_OF_CHARS]; 13}; 14 15int N; 16char **words, **meanings; // ★ (1) meanings を追加 17 18Node *create() { 19 Node *node = (Node *) malloc(sizeof(Node)); 20 node->id = -1; 21 22 for (int i = 0; i < NUM_OF_CHARS; i++) node->next_char[i] = NULL; 23 return node; 24} 25 26void show(Node * curr, char *str, int pos) { 27 if (curr == NULL) return; 28 if (curr->id != -1) { 29 str[pos] = '\0'; 30 printf("%d\t%s\t%s\n", curr->id+1, str, curr->meaning); // ★ %s 31 } 32 for (int i = 0; i < NUM_OF_CHARS; i++) { 33 if (curr->next_char[i] != NULL) { 34 str[pos] = i + 'a'; 35 show(curr->next_char[i], str, pos+1); 36 } 37 } 38} 39 40void insert(Node *freq, char *str) { 41 static int WID = 0; 42 if (freq == NULL) return; 43 while (*str) { 44 char ch = *str - 'a'; 45 if (freq->next_char[ch] == NULL) freq->next_char[ch] = create(); 46 freq = freq->next_char[ch]; 47 str++; 48 } 49 if (freq->id == -1) { 50 freq->meaning = (char *)malloc(strlen(meanings[WID]) + 1); // ★ 51 strcpy(freq->meaning, meanings[WID]); // ★ (3) 意味の登録 52 freq->id = WID++; 53 } 54} 55 56int search(Node *curr, char *keyword) { 57 if (curr == NULL) return -1; 58 while (*keyword) { 59 char ch = *keyword - 'a'; 60 if ((curr = curr->next_char[ch]) == NULL) return -1; 61 keyword++; 62 } 63 return curr->id; 64} 65 66void read_text(char *fn) { 67 FILE *fp = fopen(fn, "r"); 68 if (!fp) { perror("fopen"); return; } 69 char str[32], str2[32]; // ★ str2 の追加 70 fscanf(fp, "%d\n", &N); 71 words = (char **)malloc(N * sizeof(char *)); 72 meanings = (char **) malloc(N * sizeof(char *)); 73 for (int i = 0; i < N; i++) { 74 fscanf(fp, "%31s%31s", str, str2); // ★ 75 words[i] = (char *)malloc(strlen(str) + 1); // ★ 76 strcpy(words[i], str); 77 meanings[i] = (char *)malloc(strlen(str2) + 1); // ★ 78 strcpy(meanings[i], str2); // ★ 79 } 80 fclose(fp); 81} 82 83int main(int argc, char *argv[]) { 84 if (argc != 3) return 3; // ★ 85 read_text(argv[1]); 86 Node *root = create(); 87 for (int i = 0; i < N; i++) insert(root, words[i]); 88 char str[32]; 89 show(root, str, 0); 90 int id = search(root, argv[2]); // ★ 91 if (id >= 0) puts(meanings[id]); // ★ 92 else printf("%s は辞書には登録されていません。\n", argv[2]); // ★ 93}

投稿2020/07/09 02:12

kazuma-s

総合スコア8224

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

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

rft3

2020/07/09 02:48

すみません、追記します。 実行可能な状態にしてもSegmentation fault (コアダンプ)となってしまいます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問