【问题标题】:int variable++ will not increment past 1 or will reset to 0int variable++ 不会增加超过 1 或将重置为 0
【发布时间】:2019-10-03 21:27:35
【问题描述】:

我必须将我的程序的一部分隔离为一个玩游戏并在游戏期间跟踪你的输赢的程序。 但是,我的损失变量最多只能增加到 1,但如果我的胜利变量增加,那么它会将损失重置回 0。 同样,一旦我退出 while 循环,它就会再次将损失重置为 0。正常win函数。

我们尝试在 if/else 子句中交换赢和输的递增位置。我们还将所有布尔值更改为仅 0 和 1,当然我已将有问题的代码与程序的其余部分隔离开来。我到处都有打印语句来跟踪变量值。我只是让 if usrWins 在整个 continueGame 中在 true 和 false 之间切换,直到 continueGame 为 false 以进行测试。

#include <stdio.h>

int main() {
    int wins = 0;                   //wins is 0
    int losses = 0;                 //loses is 0
    char usrGame;                   //user yes or no answer
    int continueGame = 1;       //replay game
    int usrWin = 1;                    //if the user wins a round

    while (continueGame){           //until user quits
        if (!usrWin){                //increment wins
            losses++;
            printf("You Losses!\n");
            printf("Wins: %d\n",wins);
            printf("Losses: %d\n",losses);
        }
        else{                       //increment losses
            wins++;
            printf("You Win!\n");
            printf("Wins: %d\n",wins);
            printf("Losses: %d\n",losses);
        }



        printf("Bool: %d  Wins: %d  Losses: %d\n",usrWin,wins,losses);
        printf("\nPlay again? ");     
        scanf("%s",&usrGame);       //prompt if user wants to continue, adding to wins and losses
        printf("\n");

        if (usrGame != 'y'){        //if not, end loop
            continueGame = 0;
        }
        else{
            if (usrWin){    //change usrWin bool
                usrWin = 0;
            }
            else{
                usrWin = 1;
            }
        }
    }

    printf("Wins: %d    Losses: %d\n",wins,losses);     //display results
    return 0;
}

预期获胜增加,然后失败,然后获胜等,最终在用户结束游戏时打印出最终值。胜利有效,但损失永远不会超过 1,如果胜利增加或游戏结束,则休息为 0。

输出如下:

你赢了!

胜:1

损失:0

布尔:1 胜:1 负:0

再玩一次?是的

你输了!

胜:1

损失:1

布尔:0 胜:1 负:1

再玩一次?是的

你赢了!

胜:2

损失:0

布尔:1 胜:2 负:0

再玩一次?是的

你输了!

胜:2

损失:1

布尔:0 胜:2 负:1

再玩一次? n

赢:2 输:0

//////////对于我总是有usrWin = 0的情况//////////

你输了!

胜:0

损失:1

布尔:0 胜:0 负:1

再玩一次?是的

你输了!

胜:0

损失:1

布尔:0 胜:0 负:1

再玩一次? n

赢:0 输:0

【问题讨论】:

  • 这个完全隔离的代码会导致那个精确的输出?
  • 可能是未定义的行为,因为您告诉scanf 您正在接受一个字符串,但您正在传递一个字符?你可能正在破坏记忆。
  • scanf%s iirc 添加了一个空终止符。那个空终止符是0,直接在usrGame之后的内存可能会被终止符覆盖?
  • usrGame 设为char[2] 数组可能更有意义(或者可能更大,除非您使用scanf 的更安全版本并保持您的scanf 相同。从概念上讲,您拥有用户输入字符,而不是数字。很高兴我能解决这个问题。我在 C 语言中变得生疏了。这需要一些脑力才能发现 XD
  • 如果您使用的是char[2],请不要忘记将scanf("%1s", &amp;usrGame) 指定为avoid a buffer overflow

标签: c


【解决方案1】:

对于您的代码,我认为您遇到的问题是 scanf 和缓冲区溢出。您告诉 scanf 读取一个字符串并将其存储在单个字符的地址中。因此,如果有两个或更多字符,scanf 将尝试写入其他变量的地址空间。使用 %s 读取时,scanf 还将在字符串末尾附加一个 \0。您的 char usrGame 不是数组。因此,任何不止一个“y”的东西都将进入其他地址空间。因此,内存损坏。

要解决此问题,您只需选择一种方法,即从输入中读取单个第一个字符然后忽略输入的其余部分,或者读取单个字符然后刷新输入流。

您可以尝试将 scanf 更改为此,它会起作用:

scanf("%c%*[^\n]",&usrGame);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多