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