2017-11-08 1 views
-2

C言語でハングマンを作成していますが、私が把握できない問題が1つあります。ユーザーが推測されている単語が持つ文字の1つを正しく推測すると、以前に推測されたすべての文字が、入力した1人のユーザーに置き換えられます。この問題の原因は何ですか?C言語 - 1つではなく複数の配列要素が置換されます

#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"); 
} 
+0

ようこそスタックオーバーフロー! _デバッグのヘルプを求める質問(なぜこのコードは機能していないのですか?)には、目的の動作、特定の問題またはエラー、および質問自体の中でそれを再現するのに必要な最短コードが含まれていなければなりません。明確な問題文がない質問は、他の読者にとって有用ではありません。参照:[mcve]を作成する方法._ –

+3

注: 'isCompleted'は初期化されていません。最初の反復で10になる可能性があります。 –

+2

コードがコンパイルされません。 [MCVE]を入力してください。 –

答えて

1

問題は、個々の文字ではなくletterGuessを保存していることです。したがって、新しい推測でletterGuessが更新されるたびに、それに対するすべての参照が変更されます。また、letterGuessが短すぎるため、終了ヌル文字の余地はありません。

最善の解決策は、letterGuesschar(又はint)、ないアレイを作製するために、及びchar *[]はなくguessedWordchar []を作ることです。 1文字に文字列を使用する理由はありません。それは文字列共有の問題を解決します。

関連する問題