实现拼写检查算法

时间:2011-12-20 18:32:35

标签: c

  

可能重复:
  Compare two text files - spellchecking program in C

我正在编写一个拼写检查程序,将用户的文本文件与字典进行比较,以查看他们输入的单词是否在字典中。

字典循环一次,然后它卡在最后一个字上。我怎样才能再次遍历字典?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

int main (void) 
{ 
    FILE * fp1, *fp2;               /* file handle  */ 
    char userword[100]; 
    char dictword[100];
    char fname[40];
    int i, j, ca, cb; 

    //  printf("Enter filename to compare to dictionary:");
    //  fgets(fname,40,stdin);
    //  fp1 = fopen(fname,"r");
    fp1 = fopen("userdoc.txt", "r"); /* open file for reading, use for
                                      * time being until name input resolved*/  
    fp2 =fopen("dictionary.txt", "r");

    if (fp1 == NULL) 
    { 
            printf("Could not open file for output.\n"); 
            return 0; 
    } 
    if (fp2 == NULL)
    {
        printf("Cannot open %s for reading \n", fname);
        exit(1);        // terminate program
    }

    for (i=0; userword[i]; i++)  
    {               
        fscanf(fp1, "%s", &userword); 
        printf("The word being checked is %s\n", userword); 

        j=getc(fp2);
        while (dictword[j] != EOF)
        {
            fscanf(fp2, "%s", &dictword); 
            /*printf("The first entry in the dictionary is %s\n", dictword); //check if   dictionary is looping*/

            if(strcmp(dictword, userword) == 0)
                {
                printf("you spelt \"%s\" correctly \n", dictword);
                break; 
            }
            else    
            {   
                /*printf("sorry \" %s \" is not in the dictionary\n", userword);*/
            }
        }
    }
    fclose(fp1);
    fclose(fp2); 
    return 0; 
} 

2 个答案:

答案 0 :(得分:0)

无法做任何事情的直接原因如下:

for (i=0; userword[i]; i++)  

此处的循环条件是一个值,即索引char处的i值。请注意,就目前而言,您的程序永远不会初始化此数组中的值(因此Basile Starynkevitch建议您使用警告进行编译,例如-Wall -Wextra)。

如果你得到任何输出,那只是一个侥幸。您的userword []数组中的值可能会填充非零值,但在许多情况下它们也可能为零。一个有趣的事情是,一些调试环境(例如gdb或MSVC)会故意用特殊值填充未初始化的内存区域,以便您更容易看到何时发生这种情况。例如,请参阅this

Sangeeth Saravanaraj试图指出你正确的方向。在那里的答案中,注意外部循环看起来像这样:

while(fscanf(fp2,"%s", wordcheck)!=EOF)//Reads word from text file into array//

这个循环将两件事合二为一 - 它将一行从fp2复制到wordcheck检查此操作是否返回EOF - 基本上表明我们在文件的末尾。当我们结束时,它会从while循环中断开。

但是,简单地纠正您的for循环并不能完全修复您的程序。想想你如何循环遍历字典中的每个单词。您的代码仅适用于单个“userdoc”单词,因为在单次通过字典后,您将位于该文件的末尾。如果您希望此方法起作用,则必须将所谓的文件指针重置为字典文件的开头:

while(fscanf(fp1,"%s", &userword)!=EOF){               

    printf("The word being checked is %s\n", userword); 
    fseek(fp2,0,0);
    while (fscanf(fp2, "%s", &dictword) != EOF)
    { ... }

答案 1 :(得分:0)

首先,我还建议您使用ddd(相应的GNU调试器)等工具逐步执行代码。在我看来,这是查找错误的最佳方法之一,因为您可以在执行期间观察所有变量的更改。

我看到的下一个问题是,您使用dictword未初始化。在第一次进入while循环之前,dictword [j]的内容是什么?

fseek(char *stream, long offset, int whence)用于设置流的文件位置指示符。还有一个名为rewind(char *stream)的函数将位置指示器重置回文件的开头(均包含在stdio.h中)。

有关详细信息,请尝试阅读man pages

基本上你可以在最后一个循环周期结束时使用rewind(fp1);(不要忘记适当地重置你的循环变量)。

希望我的问题是对的;)。