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

时间:2015-12-10 05:30:12

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

我有一个带有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中解决这个问题?

2 个答案:

答案 0 :(得分:3)

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

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

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

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

答案 1 :(得分:0)

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

struct T
{
    char id[5];
};

请参阅此example