2016-06-11 81 views
0

我在嘗試製作c中的tic tac toe遊戲時感到困惑。我正在關注一本使用8個元素的單個char數組來創建電路板的書。我知道數組[8]包含9個元素,但是如果數組被聲明爲char數組,那麼它必須包含空格來爲遊戲創建空白板,不應該是數組[9],因爲它必須包含9個字符加上空字符'\ 0'?我將這個板轉換成二維數組時有同樣的疑問,因爲我知道該板應該用一個數組[3] [3]製成,但是如果我想將它聲明爲char,那麼它的位置在哪裏空字符?在c - tic tac toe遊戲中初始化2d char數組

+0

如果你知道字符串和字符數組的區別,你會想通了。 – wrangler

+0

8個字符的數組將包含8個字符。當你指的是一個c風格的字符串,比如char * str =「hello」,那當你需要擔心爲那個額外的'\ 0' – StaticBeagle

+0

留下空間時「我知道一個數組[8]包含9個元素」。不,它包含8個元素。是什麼讓你相信嗎? –

回答

0

如果使用字符數組來存儲字符串,則需要終止零。

在任務的情況下,不需要在數組中存儲字符串。

所以用C你可以聲明例如3×3陣列的以下方式

​​

該數組的每個元素將不包含終止零儘管它是由一個字符串初始化。

另一方面,如果您認爲輸出這樣的數組會更簡單,那麼您可以在每個元素中包含終止零。在這種情況下,陣列應該像

char board[3][4] = 
//   ^^^ 
{ 
    " ", // three spaces 
    " ", 
    " " 
}; 

至於你語句

陣列[8]包含9個元素

則數組被聲明爲具有正好8被定義元素。 :) 我認爲你的意思是字符串文字。例如,C中的字符串文字爲"Hi"的文件類型爲char[3],因爲存儲在文字中的終止零。

0

二維數組本質上是一維數組,增加了編程人員的易用性。您所讀的書可能只是將這些值存儲在單元格中,並將它們顯示爲字符串,而不是像字符串一樣,就像您所說的那樣。這比將整個電路板作爲字符串存儲更有效率。

假設您想要存儲4x4區域的二維數組。你可以把它表示大小爲16的一維數組,並獲得indicies像這樣:

arr[j + i * 4] 

,其中的J,你是在4單元塊,而我就是4單元塊你在

此外,大小[8]的數組有8個元素。例如:

char arr[8]; // has 8 elements, not 9 
0

我知道一個數組[8]包含9個元素

沒有,爲什麼它應該是什麼?定義爲int arry[8]的數組僅包含8個元素。那也是,在C中,數組索引是基於0的,意思是,對於上面的一個數組,只有array[0]array[7]纔是有效訪問。

也就是說,對於一個char數組,要用作字符串,應該也有空終止符的空間。因此,如果您想要有一個由9個元素組成的char數組,並且想將其用作字符串,則需要將其定義爲char[10]

0

使用字符作爲數組的值與char的數組可能衰減爲指針char*並被解釋爲終止字符串的事實無關。

字符串在C中沒有特定的類型,它只是一種解釋某些數據的方法。所以你在混合兩個概念。

A char數組並非必須是NUL已終止,它需要NUL終止,如果要將它用於將函數用作字符串的函數。

擁有char board[3][3]是完全合法的,並且有9個字符元素的空間,因爲您不打算將該數據用作字符串,所以它不需要\0

1

一個字符數組可以在任何位置保存任何值。只有當你想要使用某些功能時,你需要確保在字符串末尾有一個NUL字符(這是一個0,而不是'0'!),它告訴函數何時停止處理!

所以:char john[4] = { 'J', 'o', 'h', 'n' };是完全合法的 - 只要不傳遞到johnstrlen(),因爲它會繼續計數,直到它找到一個0值,並且沒有任何陣列中!

另外:char tictactoe[3][3];不需要0任何地方 - 除非你試圖將整個陣列傳遞給printf()出於某種原因...

請注意,您可以放心地執行以下操作:

printf(" %c | %c | %c \n", tictactoe[0][0], tictactoe[0][1], tictactoe[0][2]); 
printf("---+---+---\n"); 
printf(" %c | %c | %c \n", tictactoe[1][0], tictactoe[1][1], tictactoe[1][2]); 
printf("---+---+---\n"); 
printf(" %c | %c | %c \n", tictactoe[2][0], tictactoe[2][1], tictactoe[2][2]); 

因爲使用%c表示「打印一個字符」,而不是「打印字符串」。

以NUL結尾的字符串形式通常被稱爲ASCIIZ(ASCII-Zeroed)字符串,並且是9個字符數組只能容納8個字符的字符串的原因(與您相反說) - 它需要第九持有NUL。

並一如既往C任何陣列從0到length-1的,因此[0][1][2]在我的例子