好的,我真的很困惑这里的数组和指针。
我正在尝试将一个简单的代码块移动到C,但不幸的是我失败了......
char tictactoe[3][6];
tictactoe[0]="-|-|-";
tictactoe[1]="-|-|-";
tictactoe[2]="-|-|-";
我收到此编译器错误:
incompatible types when assigning to type 'char[6]' from type 'char *'
有人可以帮我解释一下正确的语法吗?
答案 0 :(得分:2)
TL-TR?
问题的简短答案就是这样,使用:
char tictactoe[3][6] = {"-|-|-","-|-|-","-|-|-"};
或者使用它,即时分配
#include <string.h>
void t_t_toe( void )
{
int i;
char tictactoe[3][6];
for (i=0;i<3;++i) strncpy(tictactoe[i], "-|-|-", 6);
tictactoe[1][0] = '+';//works fine now
}
这就是为什么以及何时使用:
你对数组和char指针之间的微妙但基本的区别感到困惑。这真的很容易,但这是一个常见的陷阱:
char *string = "foobar";
char string2[] = "foobar";
现在,这两个语句似乎做同样的事情,但是第一个声明指向char / chars的指针,后者声明一个字符数组 。有什么不同?简单:
char *string = "foobar";
创建一个常量的字符数组,并将其存储在只读堆栈内存的一部分中。然后将“foobar”驻留在内存中的位置(内存地址)分配给*string
。
这意味着
printf("%c", string[1]);
确实会打印 o ,但
string[1] = 'Q';
将失败,因为它会尝试重新分配只读内存中的值。不行。
与第二个示例相反,您将在其中创建相同的常量char数组,但它将复制到读写堆栈内存中的数组。它们将以完全相同的方式运行,直到您尝试更改字符串的程度。正如我所解释的那样,使用指向常量字符串的指针不起作用,但因为第二个例子复制字符串:
string2[1] = 'Q';
将完美运作。
现在,你的情况:根据你的需要,这将很好地工作:
char *ticktacktoe[3] = {"-|-|-","-|-|-","-|-|-"};
初始化一个包含3个char指针的数组,并为它们分配3个char常量“ - | - | - ”的地址。该数组将如下所示:
{ 0xabc123f4, 0xabc123f8, 0xabc123fb} //or something similar
然而,您将无法执行重新分配数组中的字符串,因此您有效地声明了const char *ticktacktoe[3]
。
如果您希望能够更改字符串写入的值:
char ticktacktoe[3][10] = {"tick", "tack", "toe"};
工作正常...将字符串分配给2D数组,最好使用strncpy
:
#include <string.h>
void t_t_toe( void )
{
int i;
char tictactoe[3][6];
for (i=0;i<3;++i) strncpy(tictactoe[i], "-|-|-", 6);
tictactoe[1][0] = '+';//works fine now
}
答案 1 :(得分:2)
{//by array
char tictactoe[3][6] ={
"-|-|-",
"-|-|-",
"-|-|-"
};
printf("%s\n%s\n%s\n", tictactoe[0], tictactoe[1], tictactoe[2]);
}
printf("\n");
{//by pointer (in C99)
char *tictactoe[3];
tictactoe[0] = (char[]){ "-|-|-" };
tictactoe[1] = (char[]){ "-|-|-" };
tictactoe[2] = (char[]){ "-|-|-" };
tictactoe[0][0]='X';//rewritable
printf("%s\n%s\n%s\n", tictactoe[0], tictactoe[1], tictactoe[2]);
}
答案 2 :(得分:1)
试试这个:
char tictactoe[3][6] = {"-|-|-","-|-|-","-|-|-"};
答案 3 :(得分:0)
tictactoe[0],
tictactoe[1],
tictactoe[2]
都是char[6]
类型,并且衰减到指向其对应行的第一个元素的指针。你不能为它分配字符串。如果你想使用指针然后声明一个指针数组
char *tictactoe[3];
然后将字符串指定为
tictactoe[0]="-|-|-";
tictactoe[1]="-|-|-";
tictactoe[2]="-|-|-";
答案 4 :(得分:0)
您可以使用以下表格:
char tic[3][6]={{'-','|','-','|','-'},{'-','|','-','|','-'},{'-','|','-','|','-'}};
首先,您尝试使用CHAR类型,因此在上面的表单中进行分配将具有正确的意义。
我认为如果你想在 tictactoe [0] =“ - | - | - ”; 形式中分配,它会将其视为指针的CHAR 。
如果您想使用相同的表格,可以使用指针。
答案 5 :(得分:0)
你想这样做:
char tictactoe[3][6] = {"-|-|-", "-|-|-", "-|-|-"};
答案 6 :(得分:-1)
1)零终止字符串零终止。你有6个字符+终结符=每行需要7个字符。
2)您无法将字符串文字分配给数组。你必须使用strcpy。