代码之家  ›  专栏  ›  技术社区  ›  Simsons

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

  •  3
  • Simsons  · 技术社区  · 14 年前

    这与我以前的 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

    5 回复  |  直到 8 年前
        1
  •  7
  •   jab    14 年前

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

    strcpy(buf.ProjectName, "3174");
    

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

        2
  •  4
  •   Naveen    14 年前

    不能在C++中分配这样的字符串。您需要使用以下函数 strcpy 复制字符串。还是继续上课比较好 std::string

        3
  •  3
  •   Raveline    14 年前

    由于您在C++中编码,所以如果需要在CHAR表中转换字符串,则应该使用STD::String管理字符串(和CXString()方法。

        4
  •  3
  •   Chubsdad    14 年前

    我们来看第一个案例:

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

    $2.13.4/1-“普通字符串 literal具有n const的类型数组 字符和静态存储时间

    类型 "3174" char const [5] char const [4] . 试图将作业 'buf.ProjectID' 编译器必须从 'char const [5]' 'char const [20]'

    $8.3.4/5-'[注:换算 数组类型的影响左值是 如4.2所述。数组对象 无法修改 ,见3.10。]".

    5.17美元-“有几个任务 接线员,哪一组 可修改的左值 作为他们的左撇子 表达式是它的左边

    总结如下:

    对于赋值表达式,左侧应该是一个可修改的左值表达式。但是数组是不可修改的左值表达式。因此不能将其分配给。

        5
  •  1
  •   Tony Delroy    14 年前

    char name[10] = "abcd";
    

    根据你上面的定义:

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

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

    但是,你不能做你的工作

    buf.ProjectName = "abcde";
    

    C++中实际要求的是基本项目名称加载一个指向包含字符数据“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