C языковая программа, которая не работает? - PullRequest
0 голосов
/ 15 марта 2012

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

int main ()
{
  char secretword[20] = {};
  char alphabet[27] = {"abcdefghijklmnopqrstuvwxyz"};
  char guess;
  int i = 0, k = 0;
  int length = 0;

  length = strlen(secretword);

  printf("You Get six chances to guess all of the letters in a phrase\n");
  printf("Enter the secret word/phrase: ");
  scanf("%s", &secretword);
  printf("Past guesses: ");
  printf("%s\n", alphabet);
  printf("Guess a character: ");
  scanf("%s", &guess);

  for(i = 0; i < 27; i++)
  {
    for(k = 0; k < length; k++)
    {
      if(secretword[k] == alphabet[i])
      {
        secretword[k] = '*';
      }
    }
  }

  printf("%s", secretword);

  return 0;
}

Ответы [ 3 ]

5 голосов
/ 15 марта 2012

Во-первых, большая логическая ошибка.Два цикла for:

  for(i = 0; i < 27; i++)
  {
    for(k = 0; k < length; k++)
    {
      if(secretword[k] == alphabet[i])
      {
        secretword[k] = '*';
      }
    }
  }

Говорит:

  • для всех символов в алфавите,
    • перебирает все символы в строке, а затем
      • если этот символ в строке равен текущему символу алфавита:
        • замените его звездочкой.

Поскольку вы выполняете итерацию по всему алфавиту, вы замените всю строку на '*',Вероятно, вам нужно что-то вроде:

for(k = 0; k < length; k++)
{
  if(secretword[k] == guess)
  {
    secretword[k] = '*';
  }
}

.

Есть и другие проблемы.Это должно быть после того, как секретное слово прочитано в:

 length = strlen(secretword);

В противном случае вы прочитаете длину неинициализированного слова.Измените его на что-то вроде этого:

 printf("You Get six chances to guess all of the letters in a phrase\n");
 printf("Enter the secret word/phrase: ");
 scanf("%s", &secretword);
 length = strlen(secretword);

Кроме того, это:

 scanf("%s", &guess);

Вероятно, должно быть:

 scanf("%c", &guess);

, так как вы планируете читать толькоchar вместо строки.


Кроме того, 27 в этой строке:

char alphabet[27] = {"abcdefghijklmnopqrstuvwxyz"};

Правильно, потому что вы хотите включить нулевой терминатор в концестрока.

Однако, это:

for(i = 0; i < 27; i++)

будет считывать до alphabet[26], что будет '\0'.Вы, вероятно, не хотите заменять эти '\0' в строке (и вы не увидите их, если наберете только strlen(secretword) символов - поскольку strlen() считается до первого '\0'),Если изменить цикл только на 26 символов, вам не понадобится проходить через secretword.Вероятно, это должно быть

for(i = 0; i < strlen(alphabet); i++)

Или, что еще лучше (как предлагает wildplasser):

char alphabet[] = {"abcdefghijklmnopqrstuvwxyz"}; 

....

for(i = 0; i < sizeof alphabet -1; i++)

И последнее: ваша программа потерпит крах, если у вас нетВ массиве secretword достаточно места для хранения прочитанной строки. Обойти это можно, попросив scanf прочитать только 19 символов:

scanf("%19s", &secretword);

Обратите внимание, что scanf завершит строку с '\0'поэтому %19s может содержать до 20 байт в строке.

2 голосов
/ 15 марта 2012

Попробуйте поставить length = strlen(secretword); после scanf("%s", &secretword);. Не вводя ничего, strlen() вернет 0, немедленно завершив цикл for.

2 голосов
/ 15 марта 2012

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

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