繁体   English   中英

错误C2440:'=':无法从'char [5]'转换为'char [20]'

[英]error C2440: '=' : cannot convert from 'char [5]' to 'char [20]'

这与我以前的帖子有关

我创建了一个Struct:

struct buffer
{
    char ProjectName[20];
       char ProjectID[20];
};

现在,当我尝试为其分配值时:

buffer buf;
buf.ProjectID = "3174";
buf.ProjectName = "NDS";

我收到此错误:

error C2440: '=' : cannot convert from 'char [5]' to 'char [20]'

并解决这个问题我尝试减少结构的大小,如下所示(不能这样做):

struct buffer
{

    char ProjectName[4];
    char ProjectID[5];
};

和获取error C2106: '=' : left operand must be l-value

您必须将字符串复制到数组中:

strcpy(buf.ProjectName, "3174");

注意要复制到数组中的字符串的长度

你不能在C ++中分配这样的字符串。 您需要使用strcpy等函数来复制字符串。 或者更好的是仍然使用类std::string

这是正常的,你无法真正为char表分配值(有很多不同的解决方案,例如sprintf或strcpy)。 但这是一个C问题,而不是C ++。

由于您使用C ++进行编码,因此您应该使用std :: string来管理字符串(如果需要在char表中转换的字符串,则使用c_str()方法)。

让我们看看第一种情况:

buffer buf; 
buf.ProjectID = "3174"; 
buf.ProjectName = "NDS"; 

$ 2.13.4 / 1 - “普通字符串文字具有类型”n const char“和静态存储持续时间(3.7)”

"3174"的类型是char const [5] ,“NDS”的类型是char const [4] 在尝试分配'buf.ProjectID' ,编译器必须基本上从'char const [5]''char const [20]' C ++规则不允许这种转换。 实际上,在您的下一次尝试中会抛出更合适的错误消息。

$ 8.3.4 / 5 - '[注意:影响数组类型左值的转换在4.2中描述。 无法修改数组类型的对象,请参见3.10。 ]”。

换句话说,这意味着,数组的名称是不可修改的左值(这是第二个编译器消息所说的)。

$ 5.17-“有几个赋值运算符,所有赋值运算符都是从右到左分组。所有赋值都需要一个可修改的左值作为左操作数,赋值表达式的类型是左操作数的类型。”

所以这是摘要:

要使赋值表达式起作用,左侧应该是可修改的LValue表达式。 但是,数组是不可修改的Lvalue表达式。 因此无法分配。

我很遗憾地说C ++在这里有点不直观。 你可以说:

char name[10] = "abcd";

并且,鉴于您的上述定义:

buffer buf = { "NDS", "3174" };

后者依赖于结构中的字段与列表中的值之间的一对一对应关系,因此我不得不颠倒您的分配中使用的顺序。

但是,你不能做你的

buf.ProjectName = "abcde";

在C ++中实际请求的是buf.ProjectName加载了一个指向包含字符数据“abcde”的内存的指针。 但是你不能这样做,因为ProjectName本身是字符数据的另一个缓冲区,而不是指向字符数据的指针。

因此,当您的源和目标区域包含NUL终止的字符串(必要时为Google ASCIIZ)时,您需要使用支持函数从一个复制到另一个:

strcpy(buf.ProjectName, "name");

如果ProjectName的维度太小,那么您的字符串可能会覆盖编译器未为ProjectName保留的内存,可能导致崩溃或错误输出。 您可以防止这种情况 - 如果字符串的相对大小显然不正确 - 使用strncpy(buf.ProjectName, "name", sizeof buf.ProjectName) 不幸的是,这意味着buf.ProjectName可能无法保持完整的预期值,因此使用起来可疑。

C ++改进了这种处理文本数据的方式 - 它继承自C - 与std :: string类。 你可以这么简单:

#include <string>
struct Buffer
{
    std::string project_name_;
    std::string project_id_;
};
Buffer b;
b.project_name_ = "abcde"; // works with string literals.
b.project_id_ = b.project_name_;  // can copy from std::string to std::string

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM