通过数组对象从结构初始化字符数组时出现的问题 [已关闭]

issue in intialising character array from the structure through an array object [closed]

提问人:ayeyo 提问时间:9/15/2021 最后编辑:Vlad from Moscowayeyo 更新时间:9/15/2021 访问量:67

问:


想改进这个问题吗?通过编辑这篇文章添加详细信息并澄清问题。

2年前关闭。

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

#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++ 数组 struct assignment-operator string-literals

评论

2赞 463035818_is_not_an_ai 9/15/2021
你遇到什么问题?请不要混淆 c 和 c++,它们是两种不同的语言。你的代码是 c++,而不是 c。您包含一个 c 标头,标头的 c++ 变体称为 ,但我认为您无论如何都没有使用它的任何东西<cstring>
2赞 Drew Dormann 9/15/2021
真的是这段代码的一部分吗?List item
1赞 463035818_is_not_an_ai 9/15/2021
由于这是 C++,您有什么理由不使用吗?std::string
0赞 Emin Niftiyev 9/15/2021
你为什么要像对待char一样对待 Emp.name
2赞 Aconcagua 9/15/2021
这种对数组的赋值根本不是语言,无论是 C 还是 C++。但是,您可以提供一个初始值:.emp v[] = { {9, "name1"}, {10, "name2"} };

答:

4赞 Vlad from Moscow 9/15/2021 #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;
}

评论

0赞 ayeyo 9/15/2021
为什么我不能只使用 v[0].name = “name1”;使用字符数组而不是 std::string ,请帮我解决这个问题
0赞 Vlad from Moscow 9/15/2021
@ayeyo 正如我在答案中所写的,数组没有赋值运算符。
0赞 BeppeNanoso 9/15/2021 #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;
}

评论

0赞 463035818_is_not_an_ai 9/15/2021
10年后,“现代”一词;)有点过时了。一些解释将有助于使这是一个很好的答案。仅代码答案现在可能会帮助提问者解决他们的具体问题,但为了帮助他们解决下一个问题,您需要解释代码
0赞 fabian 9/15/2021
也许更现代一点,而不是在这里使用;)当然,如果后备字符数组可能会更改,这不会起作用,这对于字符串文字来说不是问题......std::string_viewstd::string
0赞 ayeyo 9/15/2021
实际上这个问题是由一个朋友主动提出的,他是用 C 语言做的,但我在 CPP 中更舒服,这就是我在 CPP 中做的原因,不使用字符串是我为了为他解决问题而做出的有意识的决定