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

Why can't I initialize a typedef struct string or char as normally?

本文关键字:字符串 结构 字符 typedef 初始化 不能 常一样 为什么      更新时间:2023-10-16

我在编程和c 。

在Linux上编程,我正在创建一个Typedef结构:

typedef struct {
    char id[10];
    string name[20];    
}Employee;

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

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

那么,为什么我不能如下初始化员工结构的字符ID和字符串名称?:

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

我从G 编译器中获取此错误:

"分配'const char [8]'到'char [9]'的不兼容类型 salesmanager.id =" id02093";"'const分配中的不兼容类型 char [4]'至'std :: __ cxx11 :: string [20] {aka std :: __ cxx11 :: basic_string [20]}’salesmanager.name =" joe";

从Typedef struct声明中初始化字符串和字符字符串和字符的正确方法是什么?

初始化和分配是两个不同(但类似)的东西。

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

您无法分配到数组。

您可以使用 memcpystrcpy copy 复制

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对象。

我认为您应该在两种情况下都使用字符串,然后使用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;
}

您无法分配给char

的数组

考虑这一行:

salesManager.id="ID02093";

您可以用字符串文字来初始化 char的数组,以便于从C继承的语法C 允许的语法。但是,您不允许使用带有数组的分配。这就是为什么您遇到此错误的原因:

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