为什么我不能正常初始化typedef结构字符串或char?

问题描述 投票:-1回答:3

我是编程和C ++的初学者。

在Linux上编程,我正在创建一个typedef结构,如下所示:

typedef struct {

    char id[10];
    string name[20];    

}Employee;

通常,当不使用struct时,我初始化字符串char:

char id[10]="ID02093";
string name="Joe";

那么,为什么我不能初始化Employee struct的char id和string name,如下所示:

Employee salesManager;
salesManager.id="ID02093";
salesManager.name="Joe";

我从g ++编译器中得到这个错误:

“'char char [8]'赋值为'char [9]'salesManager.id =”ID02093“;”的不兼容类型将'const char [4]'赋值给'std :: __ cxx11 :: string [20] {aka std :: __ cxx11 :: basic_string [20]}'salesManager.name =“Joe”的不兼容类型;

从typedef结构声明中初始化typedef结构元素的字符串和char的正确方法是什么?

c++ string struct char typedef
3个回答
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;
}

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对象分配值,包括字符串文字。


0
投票

You cannot assign to an array of char

考虑到这一行:

salesManager.id="ID02093";

您可以使用字符串文字初始化char数组,这是从C继承的语法C ++允许的方便。但是,不允许使用带数组的赋值。这就是你遇到这个错误的原因:

incompatible types in assignment of ‘const char [8]’ to ‘char [9]’ salesManager.id="ID02093";

相反,您必须将数据复制到数组中。

You cannot assign to an array of 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声明为数组。

Avoid using anonymous classes

给予匿名类类型的typedef名称与类名称的语义略有不同。由于差异很棘手,因此最好避免使用匿名类,如果它不包含在类本身中。

© www.soinside.com 2019 - 2024. All rights reserved.