c - 如何只初始化字符数组的一部分?

标签 c initialization slice array-initialization

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

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

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

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 为可变字符串。

最佳答案

如果你想使用变长数组,初始化是不可能的,但为什么不使用 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];

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

关于c - 如何只初始化字符数组的一部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48058925/

相关文章:

c++ - const 数组类成员初始化

python - 理解 python 语言引用中描述的 python 切片语法

c++ - #include <文件名> 和 #include "filename"有什么区别?

c - 私有(private)寄存器变量|开放MP

c - 我正在使用MinGw编译器,每当我尝试调试代码时都会出错。以及为什么在我使用mingw时它的位置是cygwin

c - 为什么 select() 不考虑超时,尤其是在多线程中

C 错误 : C2040: 'customerPtr' : 'int' differs in levels of indirection from 'customer *'

javascript - 我可以在 JavaScript 中为 null 初始化的属性赋值吗?

python - 这条 Python 字符串切片语句中的两个冒号的用途是什么?

string - 从字符串创建字符切片的滑动窗口迭代器