2016-07-28 87 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