【问题标题】:Initialize char arrays from string literal从字符串字面量初始化 char 数组
【发布时间】:2016-03-15 15:27:39
【问题描述】:

我有一个内部带有 char 数组的结构,但是如果字符串变长,我找不到合适的方法来初始化它。

struct T
{
    char id[4];
};

T t{ 'a','b', 'c','d'}; // case 1: OK

T t{"abcd"};   // case 2: ERROR, "abcd" size is 5, too long for id

我得到以下错误:

   error: initializer-string for array of chars is too long [-fpermissive]
     T t{"abcd"};

原因是字符串字面量“abcd”包含空终止符,所以大小为5。

C99 string literals 允许这种语法,我如何在 C++11 中解决?

【问题讨论】:

  • 也许一种解决方法是在构造函数中获取一个 c 字符串并从中复制 4 个字符,但要小心,以防它更小。
  • @NeilKirk 抱歉忘记提及 T 类型是第三方库,我无法更改。
  • 听起来不是一个非常高质量的 3rd-party 库,或者您可能只是错过了 API 中的某些内容。如果它真的那么糟糕,为什么不从它派生一个你自己的类,以便你可以在接口中添加任何你想要的“好”东西?
  • 头文件中的 T 构造函数声明是什么样子的?
  • T t{'a', 'b', 'c', 'd'}; 不是一个足够好的解决方法吗?

标签: c++ arrays string c++11


【解决方案1】:

你运气不好。如果您无法更改T,那么除非您放弃直接初始化,否则没有解决方法。您必须使用T t{'a', 'b', 'c'}; 等。这是因为T 是一个聚合,所以初始化的唯一形式是为每个元素传递实际的初始化程序。

当然你可以写一个函数,例如:

T t = T_from_literal("abcdefgh...");

该函数使用std::copy 或类似函数将字符复制到T t; 并按值返回,利用复制省略。

【讨论】:

    【解决方案2】:

    初始化时您可能介意字符串末尾的 '\0' 字符,因此您总是需要多取一个字符才能使其工作:

    struct T
    {
        char id[5];
    };
    

    看到这个example

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-02
      • 2021-04-16
      • 2011-05-15
      • 2022-11-17
      • 1970-01-01
      • 2014-08-23
      • 1970-01-01
      相关资源
      最近更新 更多