【问题标题】:error C2440: '=' : cannot convert from 'char [5]' to 'char [20]'错误 C2440:“=”:无法从“char [5]”转换为“char [20]”
【发布时间】:2010-08-31 18:35:55
【问题描述】:

这个链接到我之前的post

我在哪里创建了一个结构:

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

【问题讨论】:

  • 使用 std::String 而不是 char 数组。

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


【解决方案1】:

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

strcpy(buf.ProjectName, "3174");

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

【讨论】:

    【解决方案2】:

    你不能像在 C++ 中那样分配字符串。需要使用strcpy等函数来复制字符串。或者最好还是使用类std::string

    【讨论】:

    • @Subhen 查看@jab 的回复,了解使用 strcpy() 的示例
    【解决方案3】:

    这很正常,您不能以这种方式真正为 char 表赋值(有许多不同的解决方案,例如 sprintf 或 strcpy)。但这是一个 C 问题,而不是 C++。

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

    【讨论】:

      【解决方案4】:

      我们来看第一种情况:

      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 表达式。然而,数组是不可修改的左值表达式。因此不能分配给它。

      【讨论】:

      • 发帖者无法理解... :-/.
      • @Tony:感谢您的反馈。稍微详细说明了下
      【解决方案5】:

      很抱歉,这里的 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多