C int变量++;增量不会超过1或将重置为0

C int变量++;增量不会超过1或将重置为0,c,C,我必须将我的程序中的一部分分离出来,以便在游戏期间玩一个游戏并跟踪你的输赢情况。 但是,我的损失变量最多只能增加到1,但是如果我的wins变量增加,那么它会将损失重置为0。 同样,一旦我退出while循环,它会再次将损失重置为0。Wins功能正常 在if/else条款中,我们尝试了在赢和输增加的地方进行交换。我们还将所有布尔值更改为0和1,当然,我已经将有问题的代码与程序的其余部分隔离开来。我到处都有打印语句来跟踪变量值。我只是让if usrWins在整个continueGame的true和fa

我必须将我的程序中的一部分分离出来,以便在游戏期间玩一个游戏并跟踪你的输赢情况。 但是,我的损失变量最多只能增加到1,但是如果我的wins变量增加,那么它会将损失重置为0。 同样,一旦我退出while循环,它会再次将损失重置为0。Wins功能正常

在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;
}
#包括
int main(){
int wins=0;//wins为0
int loss=0;//loss为0
char usrGame;//用户回答是或否
int continueGame=1;//重播游戏
int usrWin=1;//如果用户赢了一轮
while(continueGame){//直到用户退出
如果(!usrWin){//increment获胜
损失++;
printf(“您的损失!\n”);
printf(“Wins:%d\n”,Wins);
printf(“损失:%d\n”,损失);
}
else{//增量损失
wins++;
printf(“您赢了!\n”);
printf(“Wins:%d\n”,Wins);
printf(“损失:%d\n”,损失);
}
printf(“Bool:%d赢:%d输:%d\n”,usrWin,Wins,loss);
printf(“\n再次播放?”);
scanf(“%s”,&usrGame);//如果用户想继续,则提示,增加赢家和输家
printf(“\n”);
if(usrGame!=“y”){//如果不是,则结束循环
continueGame=0;
}
否则{
if(usrWin){//更改usrWin bool
usrWin=0;
}
否则{
usrWin=1;
}
}
}
printf(“赢:%d损失:%d\n”,赢,损失);//显示结果
返回0;
}
预期赢家会增加,然后输家,然后赢家等,最后在用户结束游戏时打印出最终值。赢是有效的,但输永远不会超过1,如果赢是递增的,或者游戏结束,则为0

输出如下所示:

你赢了

胜利:1

损失:0

布尔:1胜1负:0

再来一次?y

你输了

胜利:1

损失:1

布尔:0胜1负:1

再来一次?y

你赢了

胜利:2

损失:0

布尔:1胜2负:0

再来一次?y

你输了

胜利:2

损失:1

布尔:0胜:2负:1

再来一次?n

赢:2输:0

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

你输了

胜利:0

损失:1

波尔:0胜0负:1

再来一次?y

你输了

胜利:0

损失:1

波尔:0胜0负:1

再来一次?n


Wins:0 LOSS:0

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

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

您只需尝试将scanf更改为此即可:

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

这个独立的精确代码导致了精确的输出?可能是因为您告诉scanf
scanf
您正在接受一个字符串,而您正在传递一个字符,所以没有定义行为?您可能正在关闭内存。
scanf
%s
iirc添加了一个空终止符。该空终止符为0,直接位于
usrGame
之后的内存可能会被终止符覆盖?使
usrGame
成为
char[2]
数组可能更有意义(或者可能更大,除非您使用更安全的
scanf
版本并保持scanf不变。从概念上讲,您使用的是用户输入的字符,而不是数字。很高兴我能解决这个问题。我对C越来越生疏了。如果您使用
char[2]
请不要忘记指定
scanf(“%1s”,&usrGame),那么就需要花点心思才能发现XD了)
to。