为计算机和用户之间正在玩的火柴棍游戏编写程序。您的程序应确保计算机应确保计算机始终获胜。游戏规则如下: - 有21个火柴棍。 - 计算机要求玩家选择1,2,3或4个火柴棍。 - 当人们选择之后,计算机会进行拣选。 - 没有人被迫拿起最后一根火柴棍输掉比赛。
#include<stdio.h>
main()
{
int n,rem;
printf("Initially 21 mathces\n");
rem=21;
for(;1;)
{
if(rem==1){
printf("Com wins\n");
break;
}
else if(rem==0){
printf("Player wins\n");
break;
}
else{
printf("Player's turn.Enter number:");
scanf("%d",n);
rem=rem-n;
}
printf("remaining sticks=%d",n);
if(rem==1){
printf("Player wins");
break;
}
else if(rem==0){
printf("Com wins");
break;
}
else{
if(rem>6){
if((rem-6)<=4){
n=rem-6;
}
if((rem-6)>4){
n=4;
}
}
if(rem==6) n=1;
if(rem<6){
n=rem-1;
}
printf("Com chooses: %d",n);
}
printf("Remaining sticks=%d",rem);
}
}
答案 0 :(得分:3)
scanf
函数需要变量的地址,你已经传递了(value of)变量本身。
scanf("%d",n);
使用这种方式:
scanf("%d",&n); // '&' is 'address of' operator and evaluates to address of the variable
您收到Seg Fault是因为scanf
将n
视为某个变量的地址,但n
包含一些垃圾值,可能是垃圾值是某些无法访问/不允许的地址记忆,因此你得到Seg Fault。
这是一种未定义的行为,明天您可能会重新启动系统并且不会获得Seg Fault,但无论如何,您的代码将无法按照您希望的方式运行。