0

テキストファイルに単語の辞書があり、テキストファイル内で特定の単語を見つける必要があります。文字{q、a、z、w、s、x、e、d、c、r、f、v、t、g、b}で構成される単語、または{d、oで終わる単語など、我ら}。私はこれを行うことができる方法を探しています。すべての単語を配列に入れるのが最も簡単でしょうか?または、すべてをテキストファイルに保存する必要がありますか?テキストファイルのアプローチを試しましたが、行き詰まりました。これが私が持っているものです。どうもありがとう!

 int size, count;

 char *p;
 char *words[];

 FILE * dict_file;

 dict_file = fopen("MyDictionary.txt", "r");

fseek(dict_file, 0, SEEK_END); // seek to end of file
size = ftell(dict_file); // get current file pointer
fseek(dict_file, 0, SEEK_SET); // seek back to beginning of file
// proceed with allocating memory and reading the file


p = dictionary;
while (p = fgets(p, size, dict_file))
{
   p += strlen(p);

   words[count] = p;

   count++;
}
4

2 に答える 2

1

明らかに、これは間違っています:

FILE * dict_file;
fseek(dict_file, 0, SEEK_END); // seek to end of file
size = ftell(dict_file); // get current file pointer
fseek(dict_file, 0, SEEK_SET); // seek back to beginning of file
// proceed with allocating memory and reading the file
dict_file = fopen("MyDictionary.txt", "r");

ファイルを開くまで(正しく)使用できないため、真ん中の3行は間違いなく予測できない結果になります。fgetsサイズが負の数またはゼロになる可能性が高く、どちらも次の呼び出しを混乱させる可能性があります。

これはあなたのコードには示されていませんが、私はあなたが何かを呼んでいると思いますmalloc()か?

p = dictionary;

また、上記のエラーを修正しているときに、これを置き換えることをお勧めします。

  while (*p != '\0')
  {
        p += 1;
  }

と:

  p += strlen(p)-1;   

[実際に各文字列の間-1に必要な場合は、を削除することをお勧めします'\0'

そうは言っても、私はおそらく、すべてを1つの巨大な単一の文字列に格納するのではなく、各文字列へのポインタの配列を持つというアプローチを取るでしょう。そうすれば、文字列から文字列に簡単に移動できます。上記のように長い文字列を引き続き使用できますが、各文字列の先頭へのポインタを持つ2次変数があり、ゼロを維持するため、上記から-1を削除します。

次に、「これらの文字で構成されるこの文字列」と「これらの文字で終わる文字列」を実行する関数を記述します。一般的に文字列処理を行う方法についてある程度の知識がある場合は、どちらも比較的簡単なはずです。

于 2013-03-02T23:18:42.043 に答える
0

POSIX準拠のシステムで作業している場合は、以下を参照してください。<regex.h>

このようにして、正規表現で単語を検索できます。私は次のようなものを推測します:

  • "([qazwsxedcrfvtab]+)[^[:alpha:]]"

  • "([[:alpha:]]*[dous])[^[:alpha:]]"

あなたの場合、しかしあなたはあなたの特定のニーズにそれらを熟達させることを忘れないでください。

   int regcomp(regex_t *preg, const char *regex, int cflags);

   int regexec(const regex_t *preg, const char *string, size_t nmatch,
               regmatch_t pmatch[], int eflags);

   void regfree(regex_t *preg);

その時見てみる関数になります。

あなたは次のようなもので行くことができます:

regext_t regex;
regmatch_t *match;

char *pos = p;
int n_matches;

regcomp (&regex, "your-regular-expression", REG_EXTENDED);
n_matches = regex.re_nsub + 1;
match = malloc (n * sizeof (regmatch_t));

while (!regexc (&regex, pos, n_matches, match, 0) {
  /* extract key and value from subpatterns
     available in match[i] for i-th submatch
     ... */

  pos += match[0].rm_eo;
}

regfree (&regex);
free (match);
于 2013-03-02T23:27:23.643 に答える