【问题标题】:issue in intialising character array from the structure through an array object [closed]通过数组对象从结构初始化字符数组的问题[关闭]
【发布时间】:2021-11-09 22:45:32
【问题描述】:

我在通过结构对象初始化结构中的字符数组时遇到问题

#include <iostream>
    #include <string.h>
    using namespace std;
    struct emp
    {
        int age;
        char name[10];
    };
    int main()
    {
        struct emp v[2];
    
    List item
    
        v[0].age = 9;
        v[0].name[] = "name1"; <-this is where i am getting error
        v[1].age = 10;
        v[1].name[]= "name2"; <-this is where i am getting error
        for (int i = 0; i < 2; i++)
        {
            cout << v[i].age << " " << v[i].name<<endl;
        }
    
        return 0;
    }

【问题讨论】:

  • 您遇到了什么问题?请不要混淆 c 和 c++,它们是两种不同的语言。您的代码是 c++,而不是 c。您包含一个 c 标头,标头的 c++ 变体称为 &lt;cstring&gt;,但我认为您无论如何都没有使用它的任何内容
  • List item 真的是这段代码的一部分吗?
  • 因为这是c++,你有什么理由不使用std::string
  • 你为什么要把 Emp.name 当作 char[]
  • 这种对数组的赋值根本不适合该语言,无论是 C 还是 C++。不过,您可以提供 initialiseremp v[] = { {9, "name1"}, {10, "name2"} };.

标签: c++ arrays struct assignment-operator string-literals


【解决方案1】:

对于初学者来说,至少有一个错字

    v[0].name[] = "name1"; <-this is where i am getting error
            ^^^^ 
    v[1].name[]= "name2"; <-this is where i am getting error
            ^^^^

数组没有赋值运算符。所以这些赋值语句

v[0].name[] = "name1";
v[1].name[]= "name2"; 

在语法和语义上不正确。

您可以在声明数组时对其元素进行初始化。

例如

struct emp v[2] =
{
    { 9, "name1" },
    { 10, "name2" }
};

否则,您可以使用标准字符串函数strcpy。例如

#include <cstring>

//...
v[0].age = 9;
strcpy( v[0].name, "name1" );
v[1].age = 10;
strcpy( v[1].name, "name2" );

另一种方法是使用std::string 类而不是字符数组。例如

#include <string>

// ...
struct emp
{
    int age;
    std::string name;
};

int main()
{
    struct emp v[2];

    v[0].age = 9;
    v[0].name = "name1";
    v[1].age = 10;
    v[1].name= "name2";
    for (int i = 0; i < 2; i++)
    {
        cout << v[i].age << " " << v[i].name<<endl;
    }

    return 0;
}

请注意,您可以使用基于范围的 for 循环,而不是普通的 for 循环。

例如

for ( const auto &item : v )
{
    cout << item.age << " " << item.name << endl;
}

【讨论】:

  • 为什么我不能只使用 v[0].name = "name1";使用字符数组而不是 std::string ,请帮助我
  • @ayeyo 正如我在回答数组中所写的那样,没有赋值运算符。
【解决方案2】:

在现代 C++ 中:

#include <iostream>
#include <string>
#include <array>

struct emp {
  int age;
  std::string name;
};

int main() {
  std::array<emp, 2> v{{{9, "name1"}, {10, "name2"}}};

  for (const auto& item : v) {
    std::cout << item.age << " " << item.name << std::endl;
  }

  return 0;
}

【讨论】:

  • 10 年后,“现代”一词有点过时了;)。一些解释将有助于使这是一个很好的答案。仅代码的答案现在可能会帮助提问者解决他们的具体问题,但为了帮助他们解决下一个问题,您需要解释代码
  • 也许更现代一点,在这里使用std::string_view 而不是std::string ;) 当然,如果可以更改支持字符数组,这将是不可行的,这不是问题字符串文字...
  • 实际上这个问题最初是由一个朋友提出的,他是在 c 中做的,但我在 cpp 中更舒服,这就是我在 cpp 中做的原因,不使用字符串是我做出的一个有意识的决定以便为他解决问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-23
  • 1970-01-01
  • 2014-02-27
  • 1970-01-01
  • 2022-01-13
  • 2013-02-19
相关资源
最近更新 更多