C语言 - 操作替换多个数组元素而不是一个

时间:2017-11-08 10:45:52

标签: c arrays replace

我正在用C语言创建hangman,但有一个问题我无法理解。当用户正确猜出正在猜测的单词中的一个字母时,程序将所有先前猜到的字母替换为刚放入的一个用户。这个问题的根源是什么?

#include<stdio.h>
#include <stdlib.h>

int main()
{
  srand(time(NULL));
  int x = 0, isCompleted, matchFound, numberOfTries = 7;
  char letterGuess[1];
  int randomIndex = rand()%14; 
  const char *wordArray[14];
  const char *guessedWord[10];
  const char *usedLetters[17];
  for (int k = 0; k < 10; k++) {
    guessedWord[k] = "_";
  }
  wordArray[0] = "butonierka";
  wordArray[1] = "centyfolia";
  wordArray[2] = "chiroplast";
  wordArray[3] = "cmentarzyk";
  wordArray[4] = "chrustniak";
  wordArray[5] = "budowniczy";
  wordArray[6] = "cholewkarz";
  wordArray[7] = "cornflakes";
  wordArray[8] = "brzydactwo";
  wordArray[9] = "germanofil";
  wordArray[10] = "lichtarzyk";
  wordArray[11] = "lutowniczy";
  wordArray[12] = "mikrocysta";
  wordArray[13] = "tryskawiec";

  const char *wordToGuess = wordArray[randomIndex];

  for(int i = 0; i < 10; i++) {
    printf(" %s ", guessedWord[i]);
  }

  printf("\n");

  while(numberOfTries != 0 && isCompleted != 10) {
    matchFound = 0;
    isCompleted = 0;
    printf("Please give a lowercase letter\n");
    printf("Left tries: %d\n", numberOfTries);
    scanf("%s", &letterGuess);
    for (int z = 0; z < 17; z++) {
      if (usedLetters[z] == letterGuess[0]) {
        matchFound = 1;
      }
    }
    if (letterGuess[0] >= 'a' && letterGuess[0] <= 'z' && matchFound == 0) {
      usedLetters[x] = letterGuess[0];
      x++;
      for (int j = 0; j < 10; j++) {
        if (letterGuess[0] == wordArray[randomIndex][j])
          guessedWord[j] = letterGuess;
          matchFound = 1;
        }
      }
      if (matchFound == 0) {
        numberOfTries--;
      }
      for(int z = 0; z < 10; z++) {
         printf(" %s ", guessedWord[z]);
      }
      printf("\n");
    } else {
      if (matchFound == 1) {
        printf("You've already given such letter!!\n");
      } else {
        printf("Wrong input, please try again!\n"); 
      }
    }
    for (int k = 0; k < 10; k++) { 
      if (guessedWord[k] != "_") {
       isCompleted++;
      }
    }
    if (isCompleted == 10) {
      printf("You have correctly guessed a word! Congrats!!\n");
    }
    printf("\n\n");
  }

  printf("The word was: %s\n", wordArray[randomIndex]);
  printf("Game over!!\n");
}

1 个答案:

答案 0 :(得分:1)

问题是您要存储letterGuess,而不是单个字符。因此,每次使用新猜测更新letterGuess时,对它的所有引用都会发生变化。此外,letterGuess太短,没有留下终止空字符的空间。

最佳解决方案是将letterGuess设为char(或int),而不是数组,并使guessedWord成为char []而不是一个char *[]。没有理由为单个字符使用字符串。这将解决字符串共享问题。