|
上のような問題が出されたんですが、過去ログ読んだんですが
ソートの部分だけが分かりませんでした
構造体習ったばかりでよく分からなくて^^;
誰か教えてもらえませんでしょうか?
関数化したソース
#include <io.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SEPARATOR " .,\t\r\n"
typedef int (*COMP )(const void *,const void *);
typedef struct {
char *pWord;
int Count;
} WORDINFO,*PWORDINFO;
/* とりあえず単語種類を200とする */
WORDINFO WordTbl[200];
int Compare(PWORDINFO ,PWORDINFO );
int WordSearch(char *FileName)
{
PWORDINFO pSearch,pTbl;
char *pText,*tk;
size_t uSize;
size_t TblLen;
FILE *fp;
/*** phase 1 テキストをメモリにロード ***/
fp = fopen(FileName,"r");
if (!fp)
return 0;
uSize = (size_t )filelength(fileno(fp));
pText = (char *)calloc(uSize + 1,sizeof(char ));
if (!pText){
fclose(fp);
return 0;
}
fread(pText,uSize,1,fp);
fclose(fp);
/*** phase 2 単語の位置をテーブルに格納する ***/
tk = strtok(pText,SEPARATOR);
while(tk){
pSearch = WordTbl;
while(pSearch->pWord){
if (!strcmp(pSearch->pWord,tk))
break;
pSearch++;
}
pSearch->pWord = tk;
pSearch->Count++;
tk = strtok(NULL,SEPARATOR);
}
/*** phase 3 ソート ***/
pTbl = WordTbl; while((pTbl++)->pWord);
TblLen = pTbl - WordTbl - 1;
qsort(WordTbl,TblLen,sizeof(WORDINFO ),(COMP )Compare);
pTbl = WordTbl;
while(pTbl->pWord){
printf("%s ..... %d\n",pTbl->pWord,pTbl->Count);
pTbl++;
}
/* 領域pTextは最後まで解放してはならない */
free(pText);
return 1;
}
int Compare(PWORDINFO ptr1,PWORDINFO ptr2)
{
return strcmp(ptr1->pWord,ptr2->pWord);
}
過去ログ
http://f1.aaa.livedoor.jp/~pointc/log132.html
|