>>404 strdup および realloc のエラーチェックなし。free なし。qsort の第4引数で警告あり。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct tag_wordcount_t{ char *word; int count; }wordcount_t;
typedef struct tag_wordlist_t{ int wordnum; wordcount_t *wordcount; }wordlist_t;
void list_add(wordlist_t *wordlist, char *word){
int i;
for(i=0;i<wordlist->wordnum;i++)
if(strcmp(wordlist->wordcount[i].word, word)==0){
wordlist->wordcount[i].count+=1;
return;
}
wordlist->wordcount=realloc(wordlist->wordcount, sizeof(wordcount_t)*(wordlist->wordnum+1));
wordlist->wordcount[wordlist->wordnum].word=strdup(word);
wordlist->wordcount[wordlist->wordnum].count=1;
wordlist->wordnum+=1;
}
int count_cmp(const wordcount_t *a, const wordcount_t *b){return b->count - a->count;}
int main(void){
wordlist_t wordlist={0, NULL};
int cnt, i, moji[3]; // cnt:英字の連続長 moji:過去三文字までの履歴
char word[3+1]; // 関数に渡すための一時変数
for(i=cnt=0;(moji[i%3]=getchar())!=EOF;i++){
if(isalpha(moji[i%3])) cnt++;
else cnt=0;
if(cnt>=3) sprintf(word, "%c%c%c", moji[(i+1)%3], moji[(i+2)%3], moji[i%3]), list_add(&wordlist, word);
}
qsort(wordlist.wordcount, wordlist.wordnum, sizeof(wordcount_t), count_cmp);
for(i=0;i<5 && i<wordlist.wordnum;i++) printf("%s : %d\n", wordlist.wordcount[i].word, wordlist.wordcount[i].count);
return 0;
}