为什么这个程序会给出一个"分段错误"什么时候在我的Linux上运行?

时间:2014-06-24 04:07:05

标签: 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(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);
    }
}

1 个答案:

答案 0 :(得分:3)

scanf函数需要变量的地址,你已经传递了(value of)变量本身。

scanf("%d",n);

使用这种方式:

scanf("%d",&n); // '&' is 'address of' operator and evaluates to address of the variable

您收到Seg Fault是因为scanfn视为某个变量的地址,但n包含一些垃圾值,可能是垃圾值是某些无法访问/不允许的地址记忆,因此你得到Seg Fault。

这是一种未定义的行为,明天您可能会重新启动系统并且不会获得Seg Fault,但无论如何,您的代码将无法按照您希望的方式运行。