如何只初始化一个字符数组?

时间:2018-01-02 10:06:43

标签: c initialization slice array-initialization

我知道C(非常简洁)的数组初始化语法,比如

char arr[12] = {[0] = '\n', [4] = 'z'};

初始化数组中的某些特定成员,但有没有办法用字符串初始化数组的整个块?像这样:

char filename[12] = {[0..9] = "data/img/"};

是否有允许它的内置语法?或者我必须坚持 memcpy()

char filename[strlen(basename) + 14];
memcpy(filename, "data/img/", 9);
memcpy(filename + 9, basename, l);
memcpy(filename + 9 + l, ".bmp", 4);
filename[l + 13] = '\0';

是我现在拥有的; filename 是有罪的字符数组, basename 是变量字符串。

3 个答案:

答案 0 :(得分:4)

(通知所有downvoters,这个答案是在编辑之前 18 分钟编写的,添加了有关VLA的信息)

有什么问题
char arr[12] = "string";

会使用终止NUL和集合初始化元素 0 .. 5 ,其中包含"string",元素 6 的字符剩下的就是将其余部分安排到NUL。

GCC有一个扩展,您可以使用值初始化一个数组范围,即

char arr[12] = {[1 ... 7] = 'a'};

但它不能使用字符串。

初始化程序根本不适用于可变长度数组。在这种情况下使用sprintf

答案 1 :(得分:4)

如果你想使用可变长度数组,初始化是不可能的,但为什么不使用snprintf而不是memcpy链与手工计算的偏移?

snprintf(filename, sizeof(filename), "data/img/%s.bmp", basename);

如果您不想手动计算VLA的维度,可以使用空目标调用snprintf并让它为您计算生成的字符串长度:

int len = snprintf(NULL, 0, "data/img/%s.bmp", basename);
char filename[len + 1];

(但请确保为两个调用使用相同的格式字符串和参数。)

答案 2 :(得分:1)

虽然这有效:

const char * basename = "base";

char filename[strlen(basename) + 14];
memcpy(filename, "data/img/", 9);
memcpy(filename + 9, basename, l);
memcpy(filename + 9 + l, ".bmp", 4);
filename[l + 13] = '\0';

这很复杂且容易出错。

对于"字符串" ('\0' - 已终止char - 数组)有str*()个函数系列。

像这样使用:

char filename[strlen(basename) + 14]; 
strcpy(filename, "data/img/"); /* Sets filename including the final 0. */
strcat(filename, basename); /* Appends to filename including the final 0.  */
strcat(filename, ".bmp"); /* ditto */