递增整数和初始化位置有奇怪的效果?
Incrementing an integer and initialisation placement having a weird effect?
我用 C 编写了以下 'Hangman game' 程序(写得又快又脏所以不要介意代码太多):
#include <stdio.h>
int main() {
char word[] = "cat";
int amountGuessesAllowed = 5;
size_t size = sizeof(word)-1; // -1 to exclude the '[=10=]'
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);
}
}
}
问题似乎与 lettersGuessed、totalTimesGuessed 和 c[=41= 这三个初始化行有关].
如果您执行该程序并输入几个字母,您会注意到由于某种原因,totalTimesGuessed
-值始终显示为 2
,它似乎不再递增。 lettersGuessed
变量似乎没有任何问题。
___
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:
现在,如果您要交换 lettersGuessed
和 totalTimesGuessed
的顺序,那么 lettersGuessed
变量就会出现问题(仍然是 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:
最后,如果我将 char c;
行放在两个整数之前:
char c;
int lettersGuessed = 0;
int totalTimesGuessed = 0;
然后一切正常!
___
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:
我已经在 Xcode 中用 gcc 测试了这个。
这必须有一个合乎逻辑的解释吗?我渴望开悟!
您在
中造成了未定义的行为
scanf("%s", &c);
因为 "%s"
说明符向目标添加了一个终止 nul
字节,它是一个 char
.
你可以试试
if (scanf(" %c", &c) != 1)
handleErrorPlease();
"%c"
之前的 space 是有意的,它会吃掉之前调用 scanf
.
留下的任何白色 space 字符
当发生未定义的行为时,实际发生的情况取决于程序在加载内存时的布局,因此更改已定义变量的顺序会导致行为不同。
我用 C 编写了以下 'Hangman game' 程序(写得又快又脏所以不要介意代码太多):
#include <stdio.h>
int main() {
char word[] = "cat";
int amountGuessesAllowed = 5;
size_t size = sizeof(word)-1; // -1 to exclude the '[=10=]'
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);
}
}
}
问题似乎与 lettersGuessed、totalTimesGuessed 和 c[=41= 这三个初始化行有关].
如果您执行该程序并输入几个字母,您会注意到由于某种原因,totalTimesGuessed
-值始终显示为 2
,它似乎不再递增。 lettersGuessed
变量似乎没有任何问题。
___
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:
现在,如果您要交换 lettersGuessed
和 totalTimesGuessed
的顺序,那么 lettersGuessed
变量就会出现问题(仍然是 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:
最后,如果我将 char c;
行放在两个整数之前:
char c;
int lettersGuessed = 0;
int totalTimesGuessed = 0;
然后一切正常!
___
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:
我已经在 Xcode 中用 gcc 测试了这个。
这必须有一个合乎逻辑的解释吗?我渴望开悟!
您在
中造成了未定义的行为scanf("%s", &c);
因为 "%s"
说明符向目标添加了一个终止 nul
字节,它是一个 char
.
你可以试试
if (scanf(" %c", &c) != 1)
handleErrorPlease();
"%c"
之前的 space 是有意的,它会吃掉之前调用 scanf
.
当发生未定义的行为时,实际发生的情况取决于程序在加载内存时的布局,因此更改已定义变量的顺序会导致行为不同。