前提・実現したいこと
c言語の問題です。「標準入力に与えられた文章の単語とその出現回数を出力せよ」という課題が解けなくて困っています。
例えば、標準入力で「this is a pen that is a pineapple」と入力されたら、
1 this
2 is
2 a
1 pen
1 that
1 pineapple
と出力される感じです。
ファイル名はword_histogram.cで、ターミナルはCygwin64を使っています。
発生している問題・エラーメッセージ
$ ./word_histogram this is a pen that is a pineapple test.sh: 23 行: 2011 終了 cat $i.in 2012 Segmentation fault (コアダンプ) | ../$cmd $args > $i.out 2>&1 ==== 期待される出力 (Correct output) ==== 1 this 2 is 2 a 1 pen 1 that 1 pineapple ==== 出力の違い (Different lines) ==== --- 1.correct 2020-06-30 22:02:09.080436000 +0900 +++ 1.out 2020-07-07 12:46:38.603230400 +0900 @@ -1,6 +0,0 @@ -1 this -2 is -2 a -1 pen -1 that -1 pineapple ================ テスト 1 失敗(failed) テスト 1 に失敗しました. (A test case is failed) プログラムを確認してください.(0)
該当のソースコード
c
1#include<stdio.h> 2#include<stdlib.h> 3#include<ctype.h> 4#include<string.h> 5#define NUM_WORDS 20000 6 7int main(){ 8 9 char w[30+1]; 10 char *word[NUM_WORDS]; 11 int count[NUM_WORDS]; 12 13 word[NUM_WORDS] = (char *)malloc(sizeof(char) * (strlen(w) + 1)); 14 if(word[NUM_WORDS] == NULL){ 15 fprintf(stderr, "Cannot allocate memory.\n"); 16 return 1; 17 } 18 19 int total = 0, i = 0, find = 0; 20 21 while(scanf("%30s", w) != EOF){ 22 23 tolower(w[strlen(w)]); 24 25 find = -1; 26 for(i=0;i<total;i++){ 27 if(strcmp(*word[i],w)==0){ 28 find=i; 29 } 30 } 31 32 if(find<0){ 33 strcpy(*word[total],w); 34 count[total] = 1; 35 total++; 36 } 37 else{ 38 count[find]++; 39 } 40 41 } 42 43 for(i=0;i<total;i++){ 44 printf("%d\t%s\n", count[i], *word[i]); 45 } 46 47 free(word[NUM_WORDS]); 48 return 0; 49 50}
###補足説明
・コンパイルはgcc -o word_histogram word_histogram.c
・実行は./word_histogram
・make testというコマンドで「すべてのテストに成功しました」と表示されれば、テスト成功。
回答5件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/07 06:00
2020/07/07 06:21 編集
2020/07/07 15:26