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

时间:2010-08-31 10:04:12

标签: c++ visual-c++ struct

这与我以前的post

相关联

我是否创建了一个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

5 个答案:

答案 0 :(得分:7)

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

strcpy(buf.ProjectName, "3174");

小心复制到数组中的字符串的长度

答案 1 :(得分:4)

您无法在C ++中分配类似的字符串。您需要使用strcpy之类的函数来复制字符串。或者更好的是仍然使用班级std::string

答案 2 :(得分:3)

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

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

答案 3 :(得分:3)

让我们看看第一种情况:

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

$ 2.13.4 / 1 - “普通字符串   literal的类型为“const of 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表达式。因此无法将其分配给。

答案 4 :(得分:1)

我很遗憾地说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 ++改进了这种使用std :: string类处理文本数据的方式 - 它是从C继承的。你可以这么做:

#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