【问题标题】:Find words within a dictionary C programming在字典中查找单词 C 编程
【发布时间】:2013-12-06 05:15:00
【问题描述】:

我有一个文本文件中的单词词典,我需要在文本文件中查找某些单词。例如由字母 {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++;
}

【问题讨论】:

  • 你能展示你尝试的文本文件方法的代码吗?目前尚不清楚您是否被困在搜索符合特定条件的单词(如您的问题所暗示的那样)或基本文件阅读(如您的代码所暗示的那样)。
  • 我被困在如何搜索单词上。在我上面的代码中,我找到了我的 txt 文件的长度。我不确定如何通过算法找到可以用字母创建的单词。

标签: c dictionary spell-checking


【解决方案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");

你不能(正确地)使用一个文件,直到你打开它,所以中间三行肯定会产生一些不可预知的结果。最有可能该大小变为负数或零,这两者都可能会扰乱以下fgets 调用。

这没有显示在您的代码中,但我希望您正在调用 malloc() 或其他什么?

p = dictionary;

当您修复上述错误时,您可能需要替换它:

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

与:

  p += strlen(p)-1;   

[如果你真的想在每个字符串之间添加一个'\0',你可能想删除-1

现在,话虽如此,我可能会采用指向每个字符串的指针数组的方法,而不是将所有内容存储在一个巨大的单个字符串中。这样,您可以简单地从一个字符串移动到另一个字符串。你仍然可以像上面那样使用你的长字符串,但是有一个带有指向每个字符串开头的指针的辅助变量[并保持零,所以从上面删除-1。

然后我会编写一个函数来执行“这个字符串是否由这些字母组成”和另一个函数“是以这些字母结尾的字符串”。如果您对通常如何进行字符串处理有所了解,那么两者都应该是相对微不足道的。

【讨论】:

  • 好的,非常感谢!因此,我不会在这三行之后打开文件,而是先打开它?我无法像你说的那样将 txt 文件中的单词保存到数组中。我会将其保存到数组 [size] [maxWordLength] 中吗?我仍然必须找到最大字长。
  • 好吧,您可以在现有代码中的每个 fgets() 之后存储 p 的值 - 是的,您需要知道文件中有多少字。或者将指针数组的大小设置为比需要更大的值...
  • 我如何设置 p 来制作所有单词的数组?并且不会是单词的数量。文本文件每行一个单词。
  • 不,您创建一个数组char *words[NUMBER],然后使用p 为每个单词设置words[wordcnt](当然要添加计数)。
  • 好的,很抱歉我在 C 语言中遇到的所有新问题,但是我会在 while 循环中这样做吗?
【解决方案2】:

如果您正在使用符合 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);

【讨论】:

  • 我从未使用过 regex.h 库,但我会调查您的代码在做什么。非常感谢!
  • 请务必阅读手册页,然后阅读 man regcomp 等。使用它们并不像最初看起来那么复杂。我希望上面给出的例子能给你一个好的开始。
猜你喜欢
  • 1970-01-01
  • 2011-02-07
  • 1970-01-01
  • 1970-01-01
  • 2013-09-20
  • 2021-06-03
  • 1970-01-01
  • 2012-12-05
  • 1970-01-01
相关资源
最近更新 更多