代码之家  ›  专栏  ›  技术社区  ›  RightLeftRight12

在字典中查找单词C编程

  •  0
  • RightLeftRight12  · 技术社区  · 11 年前

    我在一个文本文件中有一本单词词典,我需要在文本文件中找到某些单词。例如由字母{q,a,z,w,s,x,e,d,c,r,f,v,t,g,b}组成的单词或以{d,o,u,s}结尾的单词。我正在寻找一种可以做到这一点的方法。把所有的单词放进一个数组中最容易吗?还是应该全部保存在文本文件中?我尝试过文本文件的方法,但被卡住了。这是我所拥有的。非常感谢!

     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++;
    }
    
    2 回复  |  直到 11 年前
        1
  •  1
  •   Kevin    11 年前

    显然,这是错误的:

    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;   
    

    [您可能想删除 -1 如果你真的想要 '\0' 每个字符串之间

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

    然后,我会写一个函数,它做“是这个字符串由这些字母组成”,另一个做“是字符串以这些字母结尾”。如果您对如何进行字符串处理有一定的了解,那么两者都应该是相对琐碎的。

        2
  •  0
  •   BenMorel lsalamon    10 年前

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