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