我对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,但字符数似乎相同。
答案 0 :(得分:3)
该算法给出误报。
单词football
的每个字母都在单词softball
中。但这并不意味着你可以重新排序字母来改变这个词。您将两个o
匹配为相同的o
字母。
查找匹配项的一种简单方法是对字母进行排序,看是否得到相同的字词。
football -> abflloot
softball -> abfllost
答案 1 :(得分:2)
你允许重复的字母被过度计算。例如,在football
中有两个'o'和两个'l',所以你允许s和u自夸。
在C代码中,通常明智地获取strlen
的结果并在循环中使用它,而不是反复调用它。只有最聪明的C编译器才注意到strlen(word)
在每次循环中都是相同的。
答案 2 :(得分:1)
您只检查当前行中是否包含来自源的字母,但是当前行中是否包含不在输入中的字母。您还需要处理多次出现的字母(在输入中和单词列表中的行中)。