我正在做这个项目,用户必须猜测一个单词(wordToGuess(,他有很多次尝试。问题在于,变量";wordToGuess;当代码到达标记的点时丢失其值("此处丢失其值"(。我不知道如何解决这个问题,我已经尝试了很多方法。谢谢你的帮助!(checkExistence是一个检查单词是否存在于词典中的函数(
void newGame(node* head){
char wordToGuess[10];
char attempt[10];
int numberOfAttempts = 0;
if (scanf("%s" , wordToGuess) != 1){
printf("error1");
}
getchar();
if (scanf("%d", &numberOfAttempts) != 1){
printf("error2");
}
getchar();
while(numberOfAttempts > 0){
if (scanf("%s", attempt) != EOF){
if (attempt[0] != '+'){
if (checkExistence(head, attempt) == false){
printf("not_existsn");
}else{
if (strcmp(wordToGuess, attempt) == 0){
printf("okn");
return;
}else{
//code
numberOfAttempts--;
}
}
}else{
if (attempt[0] == '+' && attempt[1] == 's'){
//HERE LOSES ITS VALUE
}else if (attempt[0] == '+' && attempt[1] == 'i'){
//other code
}
}
}else{
printf("ko");
return;
}
}
return;
}
这里有一个测试用例:
2rj9R (wordToGuess)
18 (numerAttemps)
DP3wc (attempt)
7PGPU (attempt)
2rz9R (attempt)
+print_list (from this point I lose the value of wordToGuess)
2rj9R (attempt)
正如其他人所说,您可能会在attempt
缓冲区中造成缓冲区溢出,从而覆盖wordToGuess
缓冲区,因为您的attempt
和wordToGuess
缓冲区是这样存储在内存中的:
<attempt buffer> | <word To Guess>
你有两个可能的解决方案(正如评论所说…(:
- 一个小的修复方法是设置从
stdin
到scanf
读取的字符数限制,如下所示:
scanf("%9s" , wordToGuess) // you need 9, because your buffer can store up to
// 10 bytes but don't forget that `scanf` is also
// addinng ` ` for you!
如果您希望用户最多只能插入9个字符,请不要忘记刷新用户输入的其余部分!
- 增加
attempt
(和wordToGuess
(缓冲区的缓冲区大小,但也增加scanf
的读取限制,如第一点所述
在wordToGuess
失去值的代码指示点,它是一个死变量。如果您在调试器中查看优化的代码,您可能会发现该变量已不存在。
在程序中的一个给定点上,死变量是指在该点之后从未使用过的变量。从该点流出的所有控制流都到达该代码的终止,而不再使用该变量。简单示例:
{
int x = 3;
// x is live here: there is a next reference
printf("%dn", x);
// x is now dead: it is not referenced after the above use
printf("foon");
}
在生成的代码中,编译器可能会安排在死变量死后立即重用与它绑定的资源:将它的寄存器和内存位置交给其他东西。
在调试器中,如果我们在printf("foon")
上设置一个断点,并尝试检查x
,我们可能会得到一个奇怪的结果。
为了有最好的机会看到预期的结果(x
仍然存在,并保留其最新的值(,我们必须在禁用优化的情况下进行编译。