次のプログラムは、すべての単語を格納してから、それらを出現回数とともに出力します。
グローバルtypedef
宣言:
typedef struct {
char * word;
int occ;
}
words;
words *data=NULL;
検索機能に問題があります。次のような関数を返しint
ます:(max
構造体の配列のサイズは常に更新されるため、にEOF
達した後に検索関数を呼び出します)。
int search(char *word,int max)
{
int i;
for(i=0; i<max; i++)
{
if(!strcmp(data[i].word,word)) return i;
}
return -1;
}
しかし、私はそのプロトタイプを持つ検索関数を書くことになっていることに気づきました:
struct abc *find(char *word)
そこで、次のコードを作成しました。
struct words *findword(char *word)
{
struct words *ptr;
for (ptr = data; ptr != NULL; ptr++) { /* IS THE STOP CONDITION OK? */
if (strcmp(word, ptr->word) == 0)
return ptr;
}
return NULL;
}
そして、コンパイル中に多くのエラーが発生します。
reverse.c:関数'findword'内:
reverse.c:73:警告:互換性のないポインタ型からの割り当て
reverse.c:73:エラー:不明な構造へのポインターの増分
reverse.c:73:エラー:不完全な型へのポインターの算術
reverse.c:74:エラー:不完全な型へのポインターの間接参照
reverse.c:関数'main'内:
reverse.c:171:エラー:'これは'宣言されていません(この関数での最初の使用)
reverse.c:171:エラー:(宣言されていない各識別子は1回だけ報告されます
reverse.c:171:エラー:表示される関数ごとに。)
make:* [reverse.o]エラー1
which
int
最初に作成した検索関数の戻り値に割り当てられた変数です。のエラーwhich
は簡単に修正できますが、それを置き換える方法がわかりません(ベース検索機能で動作するソリューション):
data[which].occ++;
検索への新しいアプローチで機能するように修正するにはどうすればよいですか?
編集
main()
追加した:
int main(int argc, char **argv)
{
char *word;
words *temp;
int c,i,num;
/*int which;*/
FILE *infile;
if(argc!=2) {}
if((infile=fopen(argv[1],"r"))==NULL) {}
num=0;
while(1)
{
c=fgetc(infile);
if(c==EOF) break;
if(!isalpha(c)) continue;
else ungetc(c,infile);
word=getword(infile);
word=convert(word);
/*which=search(word,num);*/
if(findword(word))
{
if(!(temp=realloc(data,sizeof(words)*(num+1))))
{}
else
data=temp;
data[num].word=strdup(word);
data[num].occ=1;
num++;
}
else
data[which].occ++;
free(word);
}
sort(num-1);
for(i=0;i<num;i++)
{}
free(data);
if(fclose(infile))
{}
return 0;
}
私は{}
無関係なコードの断片に向けて出発しました。エラー処理。
EDIT2 私が上で求めているものは修正されています。しかし、今はセグメンテーション違反が発生しています。コード全体へのリンクを示します。大きな混乱を招くため、編集済みの投稿には入れたくありません。セグメンテーション違反は73行目と152行目が原因です(strcmpが何らかの理由で機能していません)。完全なコードが理解しやすくなることを願っています。 フルコード