私はCとポインタを初めて使っているので、今でも地獄です!以下は、単語がテキストファイルに何回出現するかを調べることを主な目的とする関数のコードです。どんな助けもありがとう!C言語のテキストファイルに単語が何回出現するかを調べる
void count_occurrences (int n, FILE *file, Entry *entries) {
file = fopen("test/flicka.txt", "r");
if (file != NULL) {
char buff[LINE_MAX_CHARS];
int i = 0;
char * haystack = fgets(buff, 1000, file);
char * needle = NULL;
char * p = NULL;
while (haystack != NULL) {
for (i; i < n; i++) {
needle = entries[i].string;
while ((p = strstr(haystack, needle)) != NULL) {
entries[i].count++;
p++;
}
}
haystack = fgets(buff, 1000, file);
i = 0;
}
fclose(file);
}
else {
printf("File not found!\n");
}
}
あなたは何度も同じ乾草を探し続けています。すでに検索されている干し草をスキップする必要があります。あなたの 'p ++;'は 'haystack = p + 1;'でなければなりません。これにより、 "aaa"は "aaaaa"と3回一致します。あなたが 'strlen(needle)'をループ外で一度計算できることを除けば、 'haystack = p + strlen(needle);'と一度だけマッチさせたいならば。 –
また、すでに開いている 'FILE *'を関数に渡すか、ローカル変数 'FILE * file'を使用して関数内のファイルを開いたり閉じたりすることにも注意してください。 'FILE * file'を関数に渡さず、ファイルを開くことで無視します。確かに、それは呼び出しコードで 'FILE * 'のコピーを傷つけることはありませんが、無意味です。 (そして、おそらく、ファイルの名前を 'const char * filename'として渡す方が、表示されているようにハードワイヤするよりも良いでしょう。あなた自身のことを繰り返す) –
助けてくれてありがとうジョナサン。どのように引数として与えられたポインタ(FILE *ファイル)を使って関数内のファイルを開くことができますか? – Nick