在C中解读字符串

时间:2012-03-12 20:53:18

标签: c string words

我对C很陌生,我想我会尝试制作一个解读字符串输入的程序,以显示一个真实的单词并让它工作,但是有些话我会得到意想不到的结果。以下是它正常工作的示例:

  

输入Word:停止

     

匹配:选择
  匹配:帖子
  匹配:罐子   匹配:现场
  匹配:停止   匹配:上衣

我使用的是一个名为“aspell”的程序的单词列表,它允许我创建一个充满单词的文件。奇怪的是,当我输入“测试”或“足球”之类的单词时,响应会带回具有输入单词中最初不存在的字母的单词。我在这做错了什么?以下是我的unscrambleWord函数,它完成了大部分工作。另外,我将发布“足球”示例

int unscrambleWord(int fgLetters) {

        // integer used for the counter
        int i = 0;

        // first make sure that the lengths of the word and of the list word is the same
        if(strlen(currentLine) == strlen(input)) {

                // loop through each letter in the word given
                for(i = 0; i < strlen(input); i++) {

                        // search the line for the current letter, if we find it increment fgLetters
                        if(strchr(currentLine, input[i]) != NULL)
                                fgLetters++;

                } // end for

                // once we have finished looping through the word; evaluate fgLetters
                if(fgLetters == strlen(input)) {

                        // fgLetters will be equal to the length of the word if each letter appears in the word
                        printf("\tMatch: %s \n", currentLine);

                } // end if - evaluate length of fgLetters

        }

    // return the fgLetters after we have possibly incremented it
        return fgLetters;

}

这是足球的例子:

Enter Word:football

Match: blastoff 
Match: boastful 
Match: flatboat 
Match: football 
Match: lifeboat 
Match: softball 

由于某些原因,匹配字符串中有s,但字符数似乎相同。

3 个答案:

答案 0 :(得分:3)

该算法给出误报。

单词football的每个字母都在单词softball中。但这并不意味着你可以重新排序字母来改变这个词。您将两个o匹配为相同的o字母。

查找匹配项的一种简单方法是对字母进行排序,看是否得到相同的字词。

football -> abflloot
softball -> abfllost

答案 1 :(得分:2)

你允许重复的字母被过度计算。例如,在football中有两个'o'和两个'l',所以你允许s和u自夸。

在C代码中,通常明智地获取strlen的结果并在循环中使用它,而不是反复调用它。只有最聪明的C编译器才注意到strlen(word)在每次循环中都是相同的。

答案 2 :(得分:1)

您只检查当前行中是否包含来自源的字母,但是当前行中是否包含不在输入中的字母。您还需要处理多次出现的字母(在输入中和单词列表中的行中)。