Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从字符串文本初始化字符数组_C++_Arrays_String_C++11 - Fatal编程技术网

C++ 从字符串文本初始化字符数组

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

我有一个包含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


这种语法是允许的,我如何在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'足够好的解决方案?