トライ木に登録された英単語を検索すると,その日本語の意味が出力されるようなプログラムを実装したいのです。
方針としては、
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,
回答2件
あなたの回答
tips
プレビュー