增加一个具有奇怪效果的整数和初始化位置?

Yan*_*rck 2 c int loops

我用C编写了以下'Hangman game'程序(编写得很快,很脏,所以不要太在意代码):

#include <stdio.h>

int main() {
    char word[] = "cat";
    int amountGuessesAllowed = 5;
    size_t size = sizeof(word)-1; // -1 to exclude the '\0'

    char guessedWord[size];
    for (int i=0; i<size; i++){
        guessedWord[i] = '_';
    }

    int lettersGuessed = 0;
    int totalTimesGuessed = 0;
    char c;

    printf("%s\n", guessedWord);
    printf("Guess %d - Enter a character: ", totalTimesGuessed+1);
    scanf("%s", &c);

    while (totalTimesGuessed < amountGuessesAllowed) {
        for(int i=0; i<size; i++){
            if (word[i] == c && guessedWord[i] == '_'){
                printf("It matches character at index %d!\n", i);
                guessedWord[i] = c;
                lettersGuessed++;
                printf("letters guessed: %d\n", lettersGuessed);
            }
        }
        totalTimesGuessed++;
        if (lettersGuessed == size) {
            printf("You win!");
            return 0;
        } else if (totalTimesGuessed == amountGuessesAllowed) {
            printf("You lose!");
            return 0;
        } else {
            printf("%s\n", guessedWord);
            printf("Guess %d - Enter a character: ", totalTimesGuessed+1);
            scanf("%s", &c);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这个问题似乎与三个初始化行的字母Guessed,totalTimesGuessedc有关.

如果您执行程序并输入几个字母,您会注意到由于某种原因,totalTimesGuessed-value似乎总是出现2,它似乎不再增加.lettersGuessed-variable 似乎没有任何问题.

___
Guess 1 - Enter a character: b
___
Guess 2 - Enter a character: c
It matches character at index 0!
letters guessed: 1
c__
Guess 2 - Enter a character: j
c__
Guess 2 - Enter a character:
Run Code Online (Sandbox Code Playgroud)

现在,如果你要交换的顺序lettersGuessedtotalTimesGuessed随后lettersGuessed-variable时遇到的问题(保持为1)!

___
Guess 1 - Enter a character: c
It matches character at index 0!
letters guessed: 1
c__
Guess 2 - Enter a character: a
It matches character at index 1!
letters guessed: 1
ca_
Guess 3 - Enter a character: 
Run Code Online (Sandbox Code Playgroud)

最后,如果我要char c;在两个整数之前放置该行:

char c;
int lettersGuessed = 0;
int totalTimesGuessed = 0;
Run Code Online (Sandbox Code Playgroud)

一切都按预期工作!

___
Guess 1 - Enter a character: c
It matches character at index 0!
letters guessed: 1
c__
Guess 2 - Enter a character: a
It matches character at index 1!
letters guessed: 2
ca_
Guess 3 - Enter a character: 
Run Code Online (Sandbox Code Playgroud)

我用Xcc在Xcode中测试了这个.

对此必须有合理的解释吗?我渴望得到启迪!

Iha*_*imi 5

您正在导致未定义的行为

scanf("%s", &c);
Run Code Online (Sandbox Code Playgroud)

因为"%s"说明符将一个终止nul字节添加到目标,这是一个单一的char.

相反,你可以尝试

if (scanf(" %c", &c) != 1)
    handleErrorPlease();
Run Code Online (Sandbox Code Playgroud)

"%c"故意之前的空间,它将吃任何以前的呼叫留下的任何空白字符scanf.

当发生未定义的行为时,它取决于程序的布局,当它加载内存时实际会发生什么,因此改变定义的变量的顺序会导致行为不同.