C++ 从字符串文本初始化字符数组
我有一个包含char数组的结构,但是如果字符串变长,我找不到一个合适的方法来初始化它C++ 从字符串文本初始化字符数组,c++,arrays,string,c++11,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
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
这种语法是允许的,我如何在C++11中工作?你运气不好。如果您无法更改
t
,则除非您放弃直接初始化,否则没有解决方法。你必须使用T{'a',b',c'}
等等。这是因为T
是一个聚合,所以初始化的唯一形式是为每个元素传递实际的初始化器
当然,您可以编写函数,例如:
T t = T_from_literal("abcdefgh...");
其中该函数使用
std::copy
或类似方法将字符复制到T中代码>并按值返回,利用复制省略。初始化时,您可能会注意字符串末尾的'\0'
字符,因此您始终需要多取一个字符才能使其正常工作:
struct T
{
char id[5];
};
看到这个也许解决方法是在构造函数中使用c字符串并从中复制4个字符,但要小心,以防它变小。@NeilKirk抱歉忘了提到T类型是第三方库,我无法更改它。听起来好像不是一个非常高质量的第三方库,或者你只是错过了API中的某些内容。如果它真的那么糟糕,为什么不从它派生一个你自己的类,这样你就可以向接口添加任何你想要的“好”东西呢?构造函数声明在头中是什么样子的?不是T{'a'、'b'、'c'、'd'代码>足够好的解决方案?