我是编程和C ++的入门者。
在Linux上编程,我正在创建如下的typedef结构:
typedef struct {
char id[10];
string name[20];
}Employee;
通常,当不使用struct时,我将字符串char初始化为:
char id[10]="ID02093";
string name="Joe";
那么,为什么我不能按如下所示初始化Employee结构的char id和字符串名称?
Employee salesManager;
salesManager.id="ID02093";
salesManager.name="Joe";
我从g ++编译器收到此错误:
”将“ const char [8]”分配给“ char [9]”的类型不兼容 salesManager.id =“ ID02093”;“分配常量时使用的类型不兼容 char [4]”到“ std :: __ cxx11 :: string [20] {aka std :: __ cxx11 :: basic_string [20]}’salesManager.name =“ Joe”;
从typedef结构声明中初始化typedef结构元素的字符串和char的正确方法是什么?
答案 0 :(得分:3)
初始化和分配是两个截然不同(但相似)的事物。
可以通过在声明/定义数组时为其提供值来初始化数组。
您无法分配给数组。
您可以使用memcpy
或strcpy
将值复制到数组中:
char name[20];
strcpy(name, "Test";
但是出于您的目的,您可以将数组初始化为结构初始化的一部分:
typedef struct {
char id[10];
char name[20];
} Employee;
Employee salesManager = {
"A12345678",
"Test"
};
/* OR */
Employee salesManager = {
.id = "A12345678",
.name = "Test"
};
由于您要问的是C ++而不是C,因此最好使用std::string
而不是原始字符数组。 std::string
更加灵活:您可以为std::string
对象分配值,包括字符串文字。
答案 1 :(得分:0)
我认为在两种情况下都应使用字符串,并使用OOP代替typedef。但是请尝试以下代码,应该可以正常工作:
#include <iostream>
using namespace std;
typedef struct {
string id;
string name;
} Employee;
int main() {
Employee salesManager;
salesManager.id = "A12345678";
salesManager.name = "Test";
cout << "Id: " << salesManager.id << endl;
cout << "Name: " << salesManager.name << endl;
return 0;
}
答案 2 :(得分:0)
char
的数组考虑这一行:
salesManager.id="ID02093";
为方便起见,从C继承的语法C ++允许使用字符串文字初始化char
数组。但是,不允许对数组使用赋值。这就是为什么出现此错误的原因:
incompatible types in assignment of ‘const char [8]’ to ‘char [9]’ salesManager.id="ID02093";
相反,您必须将数据复制到数组中。
string
的数组考虑这一行
salesManager.name="Joe";
失败的原因是因为您还声明了name
也是一个数组。
typedef struct { char id[10]; string name[20]; }Employee;
这说明了为什么出现此错误:
incompatible types in assignment of ‘const char [4]’ to ‘std::__cxx11::string [20] {aka std::__cxx11::basic_string [20]}’ salesManager.name="Joe";
您可能并不打算将name
声明为数组。
赋予匿名类类型的typedef
名称与类名称的语义略有不同。由于差异很棘手,因此最好避免使用匿名类(如果该类本身不包含匿名类)。