为什么我不能像往常一样初始化typedef结构字符串或char?

时间:2019-02-19 19:35:12

标签: c++ string struct char typedef

我是编程和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的正确方法是什么?

3 个答案:

答案 0 :(得分:3)

初始化和分配是两个截然不同(但相似)的事物。

可以通过在声明/定义数组时为其提供值来初始化数组。

您无法分配给数组。

您可以使用memcpystrcpy将值复制到数组中:

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名称与类名称的语义略有不同。由于差异很棘手,因此最好避免使用匿名类(如果该类本身不包含匿名类)。