C 为什么这个计划会给出一个“答案”;分段故障“;什么时候在我的linux上运行?

C 为什么这个计划会给出一个“答案”;分段故障“;什么时候在我的linux上运行?,c,linux,loops,if-statement,C,Linux,Loops,If Statement,为计算机和用户之间正在玩的火柴棒游戏编写程序。您的程序应确保计算机应确保计算机始终获胜。游戏规则如下: -有21根火柴。 -电脑让玩家挑选1、2、3或4根火柴。 -在人挑选之后,计算机进行挑选。 -任何被迫拿起最后一根火柴棒的人都会输掉比赛 #include<stdio.h> main() { int n,rem; printf("Initially 21 mathces\n"); rem=21; for(;1;) { if(r

为计算机和用户之间正在玩的火柴棒游戏编写程序。您的程序应确保计算机应确保计算机始终获胜。游戏规则如下: -有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);
    }
}
#包括
main()
{
int n,rem;
printf(“最初为21个数学运算\n”);
雷姆=21;
对于(;1;)
{   
如果(rem==1){
printf(“Com-wins\n”);
打破
}
否则如果(rem==0){
printf(“玩家赢”\n);
打破
}
否则{
printf(“玩家回合。输入号码:”);
scanf(“%d”,n);
rem=rem-n;
}
printf(“剩余棍棒=%d”,n);
如果(rem==1){
printf(“玩家获胜”);
打破
}
否则如果(rem==0){
printf(“Com赢”);
打破
}
否则{
如果(雷姆>6){
如果((rem-6)4){
n=4;
}
}
如果(rem==6)n=1;

如果(rem
scanf
函数需要变量的地址,则您已经传递了变量本身的(值)

scanf(“%d”,n);

这样做:

scanf(“%d”、&n);/“&”是“address of”运算符,计算结果为变量的地址

获得Seg错误是因为
scanf
n
视为某个变量的地址,但是
n
包含一些垃圾值,可能是垃圾值是内存中某个不可访问/不允许的地址,因此获得Seg错误


这是一种未定义的行为,可能是明天您重新启动系统并没有出现Seg故障,但无论如何,您的代码都不会按您希望的方式工作。

scanf(“%d”,n”);
应该是
scanf(“%d”,n)|
。并学习缩进代码。阅读未缩进的代码很痛苦。真正的程序员使用缩进:|启用所有警告-此错误可能已被编译器捕获:
警告:格式“%d”要求类型为“int*”,但参数2的(;1;)类型为“int”
不是必需的1。例如,
为(;)
谢谢你。我在与编程长时间脱节后犯了一个愚蠢的错误。