在c-tic tac toe游戏中初始化2d char数组

时间:2016-06-11 11:58:53

标签: c arrays string tic-tac-toe

我在尝试用c做tic tac toe游戏时感到困惑。我正在阅读一本书,该书使用一个包含8个元素的char数组来创建电路板。我知道一个数组[8]包含9个元素,但如果数组被声明为char数组,因为它必须包含空格来构成游戏的空板,不应该是数组[9],因为它必须包含9个字符加上空字符'\ 0'?在将电路板转换为二维数组时,我有同样的疑问,因为我知道电路板应该用数组[3] [3]制作,但如果我想将它声明为字符,那么它的位置是空字符?

5 个答案:

答案 0 :(得分:1)

字符数组可以在任何位置保存任何值。只有当您想要使用某些功能时,才能确保其中有一个NUL字符(即0,而不是'0'!)字符串的结尾 - 告诉函数何时停止处理!

所以:char john[4] = { 'J', 'o', 'h', 'n' };完全合法 - 只是不要将john传递给strlen(),因为它会一直计算,直到找到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)字符串,这就是为什么九字符数组只能容纳一个八字符字符串的原因(与你所说的相反) ) - 它需要第九个来持有NUL。

并且,与C一样,任何数组都从0到长度为1,因此我的示例中的[0][1][2]

答案 1 :(得分:0)

2D阵列本质上是一维阵列,为程序员增加了易用性。您阅读的书可能只是将值存储在单元格中,并将其显示为字符串,而不是像字符串一样显示。这比将整个电路板存储为字符串更有效。

假设您要存储4x4区域的2D数组。您可以将其表示为大小为16的一维数组,并且可以访问以下标记:

arr[j + i * 4]

其中j是你所在的4个单位区块,而我就是你所在的4个单位区块。

此外,size [8]的数组有8个元素。例如:

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

答案 2 :(得分:0)

  

我知道数组[8]包含9个元素

不,为什么会这样?定义为int arry[8]的数组仅包含8个元素。同样,在C中,数组索引是基于0的,意味着,对于上面的数组,只有array[0]array[7]才有效。

也就是说,对于char数组,将用作 string ,也应该有空终止符的空间。因此,如果您想要一个包含9个元素的char数组,并希望将其用作字符串,则需要将其定义为char[10]

答案 3 :(得分:0)

使用字符作为数组的值与char数组可以衰减到指针char*并被解释为NUL终止字符串这一事实无关

字符串在C中没有特定类型,它只是解释某些数据的一种方式。所以你要混合两个概念。

char数组不必NUL终止,如果要将其与将使用数据作为字符串的函数一起使用,则需要NUL终止。< / p>

拥有char board[3][3]是完全合法的,并且有9个char元素的空间,因为你不打算将这些数据用作字符串,所以它不需要\0

答案 4 :(得分:0)

如果使用字符数组存储字符串,则需要终止零。

对于您的任务,不需要在数组中存储字符串。

所以在C中你可以用以下方式声明一个3 * 3数组

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

虽然数组的每个元素都是由字符串文字初始化的,但它不会包含终止零。

另一方面,如果您认为输出这样的数组会更简单,那么您可以在每个元素中包含终止零。在这种情况下,数组应该定义为

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

至于你的陈述

  

数组[8]包含9个元素

然后声明数组恰好有八个元素。 :) 我认为你的意思是字符串文字。例如,由于存储在文字中的终止零,C中的字符串文字"Hi"的类型为char[3]