【问题标题】:How to initialize a char array from a char pointer in C++?如何从 C++ 中的 char 指针初始化 char 数组?
【发布时间】:2023-03-17 08:01:01
【问题描述】:

我想用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);。这使您的测试人员对生成的代码的更改更加健壮。

标签: c++ arrays string


【解决方案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;
      }
      

      【讨论】:

        猜你喜欢
        • 2011-04-10
        • 2012-06-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多