繁体   English   中英

初始化二维字符数组

[英]Initialize 2d array of chars

我试图用这个 ode 初始化 2d 字符数组

int x=4;
int y=4;
char plg[x][y]={{"o","o","o","o"},{"o","o","o","o"},{"o","o","o","o"},{"o","o","o","o"}};

但是这段代码抛出错误error: excess elements in char array initializer| 我搜索了一段时间,一切都说这是如何做二维字符数组的正确方法。 为什么会抛出错误?

在 C 中,您不能使用动态表达式作为全局变量的数组大小。 自 C99 标准以来,局部变量是可能的,但这些称为VLA数组无法初始化。

出于您的目的,您必须直接使用文字常量或常量表达式指定大小。 您可以使用宏来提高可读性,但#define x 4是一个坏主意,因为像x这样的短标识符可能会在程序的其他地方使用,并且也会被替换,从而导致模糊的错误。

你不能初始化的二维数组char与为每个字符串char ,你可以使用字符文字是这样的:

char plg[4][4] = {
    {'o','o','o','o'},
    {'o','o','o','o'},
    {'o','o','o','o'},
    {'o','o','o','o'}
};

或者您可以使用字符串文字来初始化数组的最后一级:

char plg[4][4] = {"oooo", "oooo", "oooo", "oooo" };

请注意,虽然您可以通过这种方式使用char文字初始值设定项省略内部大括号:

char plg[4][4] = {'o','o','o','o','o','o','o','o','o','o','o','o','o','o','o','o' };

不可能以这种方式合并字符串初始值设定项:

char plg[4][4] = { "oooooooooooooooo" }; // warning: initializer-string for char array is too long

上面的语法只用'o'初始化第一个子数组,剩下的 3 个用'\\0'初始化

如果您确实需要动态的大小,则需要以其他方式初始化数组:

void myfunc(int x, int y) {
    char plg[x][y];
    int scores[x][y];

    // you can initialize char arrays this way
    memset(plg, 'o', sizeof(plg));

    // you need a loop for other types
    for (int i = 0; i < x; i++) {
        for (int j = 0; j < y; j++) {
            scores[i][j] = 1;
        }
    }
    ...
}

您仍然需要小心使用此功能:您必须检查用户输入并避免在自动存储(也称为堆栈)中分配过多数据。 足够大或可能为负的xy值将调用未定义的行为。 只允许使用较小的值,通常小于 256。对于更通用的解决方案,您需要从堆中分配plg

"this is a string"

'o' /* this is a character */
#define N_ROWS 4
#define N_COLS 4

你必须用 ' (single) 替换 " 因为它不是字符串而是字符:

char plg[N_ROWS][N_COLS]={{'o','o','o','o'},{'o','o','o','o'},{'o','o','o','o'},{'o','o','o','o'}};

此外,必须在编译时而不是在运行时定义初始值设定项,否则它将是一个动态数组,您需要手动为其分配内存。

通常你需要定义rowscols声明矩阵时,如:

#define N_ROWS 4
#define N_COLS 4

char plg[N_ROWS][N_COLS]={{'o','o','o','o'},{'o','o','o','o'},{'o','o','o','o'},{'o','o','o','o'}};

现在,如果你需要rowscols作为输入变量,你需要动态允许阵列。 例如,

#include <stdlib.h>
#include <string.h>

int x = 4;
int y = 4;
char **plg = malloc(sizeof(char *) * x);
int i = 0;
for( i = 0; i < x; i++ )
{
    plg[i] = malloc(sizeof(char) * (y + 1));    // +1 for NULL terminator
}

for( i = 0; i < x; i++ )
{
    strcpy( plg[i], "oooo" );
    printf( "%s \n", plg[i] );
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM