前提・実現したいこと
大学の課題でリスト構造を用いたワードカウンタ(文章を読み込み、単語を一つずつ認識して文章中に何回出てきたかを出力するプログラム)を作成しています。
リスト構造がいまいち良く分からないまま頑張ってプログラムに追加していましたが、segmentation faultが出て手詰まりになってしまいました。
このプログラムをちゃんとした形で動かしたく、ご助力をお願いします。
発生している問題・エラーメッセージ
リスト構造を用いたところ、各関数に新たな引数を設定したのでそれをmain関数内の足りないと出てきたところを補ったらsegmentation faultが出ました。 それ以外ですと wordlist.c: In function ‘get_word’: wordlist.c:24:2: warning: null argument where non-null required (argument 2) [-Wnonnull] strcpy(list->word,'\0'); が出ました。
該当のソースコード
C
1# include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4 5FILE *fp; 6char word[1024]; 7 8struct LIST{//単語を登録する構造体 9 char word[1024];//単語 10 int count; 11 struct LIST *next; 12}; 13 14int get_word(struct LIST *list){ 15 char letter;//文章内の単語 16 17 letter = fgetc(fp); 18 while(!(letter == ' ' || letter == EOF || letter == ',' || letter == '.')){ 19 //この条件が成り立たない場合 20 strcpy(word,list->word);//単語をwordリストに入れる 21 list->count ++;//リスト番号を1増やす 22 letter = fgetc(fp);//これ初期化的な奴? 23 } 24 strcpy(list->word,'\0'); 25} 26int list_length = 0; 27 28void count_up(struct LIST *list){ 29 int i; 30 31 for(i =0;i< list_length;i++){//単語数だけ繰り返す 32 if(strcmp(list->word,word)){//もし同じ単語なら 33 list[i].count++;//カウントする 34 return ; 35 } 36 } 37 list[i].count = 1; 38 strcpy(list->word,word); 39 list_length++; 40 return; 41} 42 43void output(struct LIST *list){ 44 int i; 45 for(i = 0;i<list_length;i++){ 46 printf("%s : %d\n",list->word, list[i].count); 47 } 48 return ; 49 50} 51 52 int main(struct LIST *list){ 53 54 int ret; 55 56 fp = fopen("input.txt" , "r"); 57 ret = get_word(list); 58 printf("%s\n",list->word); 59 60 while(ret == 1){ 61 count_up(list); 62 ret = get_word(list); 63 printf("%s\n",list->word); 64 } 65 output(list); 66 return 0; 67} 68
試したこと
とにかくエラーをなくすことに専念したのでエラー表示が出なくなってからは何がおかしいのか確認できないくなってしまいました。
補足情報(FW/ツールのバージョンなど)
使用しているのはvimエディタでコンパイラはgccです。
windows10に標準搭載のLinax(Ubuntu/Bash)環境で作業しています。
struct LIST の総数は単語数に伴って増加するはずよね? どこで増やして(=mallocして)ます?