数组必须用大括号括起来的初始化程序 c++ 初始化

Posted

技术标签:

【中文标题】数组必须用大括号括起来的初始化程序 c++ 初始化【英文标题】:array must be initialized with a brace-enclosed initializer c++ 【发布时间】:2021-07-18 00:48:39 【问题描述】:

你好,我有一个练习,他们给了我这个结构:

enum Sexe  INCONNUE=0, MASCULIN=1, FEMININ=2;

struct Personne 
    int numero;
    char nom[10];
    Sexe sexe;
;

我需要创建一个指针并为其赋值。所以我做了这个功能:

void Init() 
        Personne *p;
        string sexe;
        Sexe s;
        string n;
        string nom;
        char name[10];
        cout << "Choisissez le numero de la personne";
        cin >> n;
        cout << "Choisissez le nom de la personne";
        cin >> nom;
        cout << "Choisissez le sexe de la personne";
        cin >> sexe;
        for (int i = 0; i < nom.length(); i++)
            name[i] = nom[i];
        
        if (sexe == "1" || sexe == "Masculin" || sexe == "masculin" || sexe == "MASCULIN") 
            s = Sexe::MASCULIN;
         else if (sexe == "1" || sexe == "Feminin" || sexe == "feminin" || sexe == "FEMININ") 
            s = Sexe::FEMININ;
         else 
            s = Sexe::INCONNUE;
        
        Personne join_pstoi(n),name,s;
        p = &join_p;

但是我有这个错误,我不明白为什么以及如何解决它:

error: array must be initialized with a brace-enclosed initializer
         Personne join_pstoi(n),name,s;

我试图将括号放在不同的地方,就像他们在我的课程或其他网站上所说的那样,但它不想工作

【问题讨论】:

【参考方案1】:

在此声明中

Personne join_pstoi(n),name,s;

结构Personne的数据成员声明为

char nom[10];

也就是说它是一个数组,

但是用作初始化器的数组name 被隐式转换为指向其第一个元素的指针。

所以你试图用指针初始化一个数组。

您不能使用指针初始化数组。需要将数组name复制到数组join_p.nom中。

注意数组name不包含字符串,但数据成员nom似乎必须包含字符串。

无论如何这个循环

for (int i = 0; i < nom.length(); i++)
    name[i] = nom[i];

不安全,因为您可以在数组name 之外写入。

结构的数据成员nom最初最好是std::string类型。

还有这些陈述

Personne join_pstoi(n),name,s;
p = &join_p;

没有太大意义,因为指针p 没有在函数内部或外部的任何地方使用,除了这个赋值。

【讨论】:

我应该如何将name复制到join_p.nom?对不起,我是从 C++ 开始的。 @rob_runner 只需将结构的数据成员 nom 声明为 std::string 类型。在这种情况下,您将能够编写 Personne join_pstoi(n), nom, s;并且数组名称将是多余的。 问题是我不允许更改结构 @rob_runner 您需要在数组名称后面附加终止零 '\0',然后您可以使用标准 C 字符串函数 strcpy 将其复制到数据成员 nom 中。但是正如我指出的那样,您的功能无论如何都没有意义。 我就像我的练习所说的那样:创建一个指向结构的指针,然后初始化指针上的所有变量

以上是关于数组必须用大括号括起来的初始化程序 c++ 初始化的主要内容,如果未能解决你的问题,请参考以下文章

创建二维数组

差异方法初始化char数组

C ++类成员函数别名模板,防止大括号括起来的初始化程序列表被识别为对/元组

多维数组

复制用大括号括起来的文本

如何解释用大括号括起来的函数值(菊石问题)