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