从字符串文字初始化字符数组

Initialize char arrays from string literal

本文关键字:字符 数组 初始化 文字 字符串      更新时间:2023-10-16

我有一个结构,里面有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"包含null终止符,因此大小为5。

这种语法允许C99字符串文字,我如何在C++11中解决这个问题?

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

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

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

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

初始化时,您可能会注意字符串末尾的''字符,因此您总是需要再使用一个字符才能使其工作:

struct T
{
    char id[5];
};

请参阅此示例