C言語について
以下のプログラムについてです
test.txtというファイルから文字を読み込み、異なる単語の数を求めるプログラムです。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
#define NMAX 80
#define LMAX 5000
void count(FILE*, int);
void all_words(FILE *);
FILE *fp, *fp2;
char *fn="test.txt";
char *fn2="total word.txt";
int main(void){
int p=0, x, count, l,k, t=0;
char name[LMAX][NMAX], word1[NMAX], word2[NMAX];
char *tp, *tp2;
if((fp=fopen(fn,"r"))==NULL){
printf("Can't open '%s'.\n",fn);
exit(1);
}
if((fp2=fopen(fn2,"w"))==NULL){
printf("Can't open '%s'.\n",fn2);
exit(1);
}
for(count=0;count<LMAX;count++){
if(fgets(name[count],NMAX,fp)==NULL)break;
p++;
}
for(count=0;count<p;count++){
for(x=0;x<NMAX;x++){
word1[x]=tolower(name[count][x]);
}
tp=word1;
while((tp2=strtok(tp,"\n !?()*-;:.,_\"[]"))!=NULL){
if(*tp2=='\''){
if(*(tp2+1)=='`')
t=1;
tp2++;
}
strcpy(word2,tp2);
k=l=strlen(word2)-1;
if(word2[k]==('\'' & l))
word2[l]='\0';
if(word2[0] =='\'' &&t==0){
if(word2[1]!='\0'){
fputs(word2+1,fp2);
fputc('\n',fp2);
}
}
else{
if(word2[0]!='\0'){
fputs(word2,fp2);
fputc('\n',fp2);
}
}
tp=NULL;
}
}
fclose(fp);
fclose(fp2);
all_words(fp2);
return 0;
}
void all_words(FILE* fp2){
char word3[NMAX];
int n=0;
if((fp2=fopen(fn2,"r"))==NULL){
printf("Can't open '%s'.\n", fn2);
exit(1);
}
for(;;){
if(fgets(word3, NMAX,fp2)==NULL)
break;
n++;
}
fclose(fp2);
count(fp2,n);
}
void count(FILE* fp2, int n){
int count, x, y=0;
char *m=(char *)malloc(n*NMAX);
char *xp,*yp;
if((fp2=fopen(fn2,"r"))==NULL){
printf("Can't open '%s'.\n", fn2);
exit(1);
}
for(count=0,xp=m; count<n;count++,xp+=NMAX){
fgets(xp,NMAX,fp2);
}
qsort(m,n,NMAX,(int (*)(const void*, const void*))strcmp);
count=1;
for(x=0,xp=m,yp=m+NMAX;x<n-1;xp+=NMAX,yp+=NMAX,x++){
if(strcmp(xp,yp)==0){
y++;
count++;
}
else{
sprintf(xp+strlen(xp)-1," (%d)",count);
count=1;
}
}
printf("KIDN OF WORD:%d\n",n-y);
free(m);
fclose(fp2);
}
このプログラムを実行するとメモリリークになってしまいます。
どうしたら良いでしょうか?
お礼
回答ありがとうございます! タブが半角8文字分とするとき、タブが開始する位置(カーソルが止まる位置)を過ぎて、文字がある場合に、タブが8文字分未満になるから、その途中の位置を知るために、count++; して、それを、for文で初期値として与える。 こういうことなんですね? どの位置からスペースに置換してよいか知るために行の桁位置を0から7としていたんですね! 回答がとても分かりやすく、理解できました。勉強になります! 回答ありがとうございました。