C Tic tac toe初学者

时间:2016-07-28 13:43:58

标签: c scanf

我收到了分段错误错误 - 有什么建议吗?我正在尝试创建一个tic tac toe游戏,我刚开始用C编程。任何建议都会有所帮助。我只是想让它现在打印到终端没有图形。

#include <stdio.h>

int main()
{
    int Board[9];
    char row1[3];
    char row2[3];
    char row3[3];
    int j = 0;
    int turns = 0;
    char x;
    x = 'x';
    char o;
    o='o';
    int spot;
    printf("Hello, and welcome to Christian's Tic Tac Toe game\n");
    printf("Here's how it works: X goes first and chooses a place(1-9 corresponding to a place on the board)\n");
    printf("First to get 3 in a row wins. Have fun!\n");
    printf("X goes first where do you want to go?");
    scanf("%d", &spot);
    Board[spot-1] = 1;
    turns = 1;
    if (spot <=3)
    {
         row1[spot-1] = x;
         for (j =0; j<3; j++)
         {
             printf("%c", row1[j]);

         }
         for (j =0; j<3; j++)
         {
             printf("%c", row2[j]);

         }
         for (j=0; j<3; j++)
         {
             printf("%c", row3[j]);

         }
    }
    else if(spot >3 && spot <=6)
    {
         row2[spot - 4] = x;
         for (j =0; j<3; j++)
         {
             printf("%c", row1[j]);

         }
         for (j =0; j<3; j++)
         {
             printf("%c", row2[j]);

         }
         for (j=0; j<3; j++)
         {
             printf("%c", row3[j]);

         }
    }
    else
    {
         row3[spot - 7] = x;
         for (j =0; j<3; j++)
         {
             printf("\n%c", row1[j]);

         }
         for (j =0; j<3; j++)
         {
             printf("%c", row2[j]);

         }
         for (j=0; j<3; j++)
         {
             printf("%c", row3[j]);

         }
    }
}

2 个答案:

答案 0 :(得分:2)

  • 您通过将具有错误类型的数据传递到printf()来调用未定义的行为。打印一个字符的格式说明符为%c,而不是%s
  • 您对for语句的使用是错误的,因此j会过大而未定义的行为将通过访问数组的超出范围来调用。< / LI>

错误代码示例:

for (j<3; j++;)
{
    printf("%s", row1[j]);
}

更正后的代码:

for (j=0; j<3; j++)
{
    printf("%c", row1[j]);
}

使用row2row3的循环需要进行相同的修正。

更多错误:

  • scanf("%s", &spot);将调用未定义的行为:再次使用错误的说明符。应该使用%d来读取整数。
  • char x ="x";char o = "o";不好,因为从字符串文字转换的指针转换的值应该没有意义。您应该使用字符常量,例如char x ='x';char o = 'o';
  • C中的数组索引将从0开始,而不是1. row1[3]不是有效对象,当声明为char row1[3];时,您不能在那里写一些东西。你应该纠正
    • row1[spot] = x; - &gt; row1[spot - 1] = x;
    • row2[spot - 3] = x; - &gt; row2[spot - 4] = x;
    • row3[spot - 6] = x; - &gt; row3[spot - 7] = x;
  • 使用具有自动存储持续时间的未初始化变量的值(不确定)将调用未定义的行为。您必须在使用char row1[3] = " ";之类的值之前初始化变量。也请像这样初始化row2row3

答案 1 :(得分:1)

有很多问题。

开头
 scanf("%s", &spot);

错误,因为spot的类型为int。您应该使用%d。否则,它会调用undefined behavior

之后,

char x ="x";
char o = "o";

也看起来不对,您要么需要char初始值设定项(即'x''o'),要么想要将变量设置为指针类型并相应地更改代码。 / p>

接下来,Board[spot-1] = 1;可能也是错误的,您将未绑定的索引值spot用于绑定值9。在将其用作索引值之前,您应该检查spot的范围。

另请参阅MikeCAT in the other answer

提及的要点