二维数组的字符

时间:2013-12-22 17:15:24

标签: c arrays pointers char

好的,我真的很困惑这里的数组和指针。

我正在尝试将一个简单的代码块移动到C,但不幸的是我失败了......

char tictactoe[3][6];

tictactoe[0]="-|-|-";
tictactoe[1]="-|-|-";
tictactoe[2]="-|-|-";

我收到此编译器错误:

incompatible types when assigning to type 'char[6]' from type 'char *'

有人可以帮我解释一下正确的语法吗?

7 个答案:

答案 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。