如何从 C++ 中的 char 指针初始化 char 数组?
Posted
技术标签:
【中文标题】如何从 C++ 中的 char 指针初始化 char 数组?【英文标题】:How to initialize a char array from a char pointer in C++? 【发布时间】:2020-01-30 12:04:41 【问题描述】:我想用string
初始化一个本地char array
,它生成为一个静态常量指针。基本上是这样的:
static const char * const FOO = "foo"; /* generated */
char bar[12] = FOO; /* my code */
编译器不接受:
error: array must be initialized with a brace-enclosed initializer
我可以使用什么构造来初始化char array
栏,其中string
指向FOO
?
上下文:在我的公司,我们使用 C++ 为 C 代码编写单元测试器 框架。因此 bar 参数必须是一个数组,不能是 C++ 字符串类型。 FOO 常数是从专有的 IDL。代码生成器为 C 代码生成一个#define,但是一个静态的 const char * const 用于 C++。
【问题讨论】:
char bar[12]; strcpy(bar, FOO);
?
你需要修改字符串吗?如果没有,为什么不直接留在指针上?
@Aconcagua: 是的,字符串必须稍后修改。
@mch 和 Thomas Sablik:您的解决方案可以,但如果可能的话,我想要一个单行解决方案。
我会将Assert(sizeof bar > strlen(FOO));
添加到测试代码中。之后strcpy(bar, FOO);
。这使您的测试人员对生成的代码的更改更加健壮。
【参考方案1】:
你不能用指针初始化数组。但是您可以在默认初始化数组后复制字符串。
在我的公司,我们使用 C++ 框架为 C 代码编写单元测试器。因此 bar 参数必须是数组,不能是 C++ 字符串类型。
我不相信你的推理。这似乎是一个错误的假设。
【讨论】:
bar 变量用作被测 C 函数的输入,该函数将 char 数组作为参数。 @slingeraap 这就是c_str
成员函数的用途。
参数被函数改变,c_str
返回一个const类型。
@slingeraap 在这种情况下,您可以使用data
成员函数(C++17 起;在旧标准中,您可以使用&bar[0]
)。
但是我们还是需要C++11,之前std::string
应该出...【参考方案2】:
我希望以下内容会起作用:
static const char * const FOO = "foo"; /* generated */
char bar[12], *pBar = strcpy(bar, FOO); /* my code */
然后您可以通过bar[]
或pBar
访问它。
多余的char *
是多余的,但它可能并不重要。
您甚至可以考虑使用以下方法来防止缓冲区溢出:
static const char * const FOO = "foo"; /* generated */
char bar[12] = 0, *pBar = strncpy(bar, FOO, sizeof(bar)/sizeof(bar[0]) - 1); /* my code */
您也可以考虑将其包装在 #define
中,如下所示:
#define MAKEARRAY(name, size, thing) char name[size] = 0, *p##name = strncpy(name, (thing), (size) - 1)
然后像这样使用它:
MAKEARRAY(bar2, 14, FOO);
【讨论】:
【参考方案3】:这可行,但恕我直言,看起来很难看:
static const char *const X = "abc";
char x[12] = X[0], X[1], X[2], X[3] ;
定义会起作用:
#define X "abc"
char x[12] = X;
【讨论】:
【参考方案4】:这并不理想,但应该给你一个想法。它使用局部变量,因此它们不会在这些函数之外持续存在。我不确定您使用的是您认为应该如何使用的静态。我建议不要把它放在函数中,因为你不能真正在函数之外访问它,但它会保留在内存中。
void ModifyString(char* data, int length)
std::cout << "Data: " << data << ", Length: " << length;
void ModifyString(const char* data)
char buffer[256];
int length = -1;
while (data[++length])
buffer[length] = data[length];
buffer[length] = 0;
ModifyString(buffer, length);
int main()
ModifyString("Hello Test");
return 0;
【讨论】:
以上是关于如何从 C++ 中的 char 指针初始化 char 数组?的主要内容,如果未能解决你的问题,请参考以下文章