如何从 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 数组?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过带有指针的函数传递 char 变量(示例已发送)?

在 C++ 中使用指针初始化 char 数组或字符串

如何在 C++ 类中初始化二维字符指针

如何将指向 char[256] 数组的指针从 C++ 编组到 C#

如何初始化字符串数组的char指针数组c ++

如何把c++中的unsigned char* mData的数据指针通过jni把数据传给java使用?