Расшифруй строку в C - PullRequest
       2

Расшифруй строку в C

1 голос
/ 13 марта 2012

Я довольно новичок в C, и я подумал, что я попытаюсь создать программу, которая расшифровывает ввод строки, чтобы показать реальное слово, и у меня это работает, но с некоторыми словами я получаю неожиданные результаты.Вот пример того, как он работает правильно:

Введите слово: стоп

Матч: опции
Матч: пост
Матч: банки
Матч: место
Match: stop Match: tops

Я использую список слов, который я получил из программы под названием «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 ]

3 голосов
/ 13 марта 2012

Этот алгоритм дает ложные срабатывания.

Каждая буква слова football находится в слове softball.Но это не значит, что вы можете изменить порядок букв, чтобы изменить слово.Вы сопоставляете две o s с одной и той же o буквой.

Простой способ найти совпадения - отсортировать буквы и убедиться, что вы получаете одно и то же слово.

football -> abflloot
softball -> abfllost
2 голосов
/ 13 марта 2012

Вы позволяете повторным буквам пересчитываться. Например, в football есть два 'o' и два 'l', поэтому вы можете использовать s и u в хвастовстве.

В C-коде обычно целесообразно один раз получить результат strlen и использовать его в своем цикле, а не вызывать его повторно. Только самые умные из C-компиляторов замечают, что strlen(word) одинаково при каждом прохождении цикла.

1 голос
/ 13 марта 2012

Вы проверяете, содержится ли только буква из источника в текущей строке, но нет, если в текущей строке есть буквы, которых нет на входе. Вам также нужно обрабатывать буквы, которые присутствуют более одного раза (во входных данных и в строке из списка слов).

...