2016-07-28 89 views
-1

我遇到了分段错误错误 - 有什么建议吗?我正在尝试创建一个tic tac脚趾游戏,并且我刚刚开始用C编程。任何建议都会有所帮助。我只是想让它现在打印到终端没有图形。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]); 

     } 
    } 
} 
+8

'char x =“x”; char o =“o”;'是非常错误的.... –

+0

请问为什么? – John

+3

'printf(“%s”,row1 [j]'也是不对的 –

回答

2
  • 提到的问题您可以通过将其错误类型printf()数据调用未定义行为。打印一个字符的格式说明符是%c,而不是%s
  • 您对for的用法错误,因此j会过大,而未定义的行为将通过访问超出范围的数组来调用。的错误代码

实施例:

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; - >row1[spot - 1] = x;
    • row2[spot - 3] = x; - >row2[spot - 4] = x;
    • row3[spot - 6] = x; - >row3[spot - 7] = x;
  • 使用具有自动存储持续时间,这是不确定的未初始化的变量的值,调用未定义行为。在使用char row1[3] = " ";之类的值之前,必须初始化变量。同样初始化row2row3这样。
1

有很多问题。与

scanf("%s", &spot); 

开始就是错误的,因为spotint类型。你应该使用%d。否则,它调用undefined behavior

之后,

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

看起来也错了,你要么希望char初始化(即'x''o'),或者你想的变量的指针类型,并相应更改代码。

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

另见MikeCAT in the other answer

+0

是的,谢谢抱歉,愚蠢的错误 – John

+0

澄清:只有'Board [0]'到'Board [8]'可用。你不能使用Board [9]'(严格地说,指针'Bound'[9]'是有效的,但是你不能对它进行取消引用)。 – MikeCAT

+0

我更新了代码,现在我只是将乱码打印到终端 – John