Сравните пользовательский ввод с текстовым файлом в C - PullRequest
0 голосов
/ 30 ноября 2011

Мне нужно, чтобы пользователь ввел слово, а затем сравнил слово с текстовым файлом, чтобы проверить, правильно ли оно.У пользователя есть 3 попытки ввести слово до завершения программы.Моя проблема заключается в чтении слова из файла, я знаю, что это что-то простое, что я ошибаюсь.Я также должен уточнить, что ошибка, которую я получаю, заключается в компиляторе, который я еще не дошел до возможности сравнить строки!

Ответы [ 4 ]

4 голосов
/ 30 ноября 2011

Вот несколько указателей:

  1. c = getc(fp) потребляет первый символ файла, поэтому он никогда не становится частью переменной secret.
  2. Если secret.txtсодержит новую строку, новая строка считывается в переменную secret.
  3. Цикл while (c != EOF) кажется бессмысленным, поскольку c не изменяется внутри цикла.Кроме того, бесконечный характер цикла препятствует правильной работе внешнего цикла for.

На вашем месте я бы исправил цикл while и убедился бы в том, что secretправильно читается, например, распечатав его или изучив в отладчике.

2 голосов
/ 30 ноября 2011

Для чего нужен

c = getc(fp);

?Моим «предположением» будет то, что вы читаете первый символ слова в c, а затем secret пропускает первый символ.

EDIT: Вместо использования getc дляПроверка EOF, которая, как сказано, повреждает прочитанное слово (и этот цикл while в любом случае является мусором), просто проверьте возвращаемое значение fgets:

if(fgets(secret, sizeof(secret), fp) == NULL)
    //file is empty or other error occurred

и удалите этот бесконечный цикл while(c != EOF).

Так что это должно выглядеть примерно так:

FILE *fp = fopen("secret.txt","r");
char guess[10];
const char secret[10];
int i;
if(fgets(secret, sizeof(secret), fp) == NULL)
{
    printf("Error while reading file\n");
    return -1;
}
fclose(fp);

for (i=0; i < 3; i++)
{
    printf("Please guess the word: \n");
    scanf("%s", guess);
    if (strcmp(secret,guess) == 0)
    {
        printf("Your guess was correct");
        return 0;
    }
    else
        printf("Your guess was incorrect. Please try again\n");
}
return 0;
1 голос
/ 30 ноября 2011

Ваш код полностью отключен: вы не изменяете 'c' внутри цикла, заставляя его вращаться бесконечно.Это хорошая идея, чтобы набросать свой алгоритм на листе бумаги, прежде чем начать кодирование.В вашем случае псевдокод должен выглядеть следующим образом:

  • Открыть файл
  • Читать секрет
  • Закрыть файл
  • Повторить три раза:
  • --- Показать подсказку
  • --- Прочитать ввод пользователя
  • --- Если ввод пользователя соответствует секрету, поздравить пользователя и выйти.
  • Скажите пользователю, что его предположение было неверным.

На этом этапе преобразование его в C должно быть более или менее механическим.Удачи!

0 голосов
/ 30 ноября 2011
while (c !=EOF)
{   
    if (strcmp(secret,guess)==0)
    {
        printf("Your guess was correct");
        return 0;
    }
    else
    {
        printf("Your guess was incorrect. Please try again\n");
    }
} 

выглядит для меня как бесконечный цикл

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...