如何在 C++ 中打印动态数组我需要解释这个问题

Posted

技术标签:

【中文标题】如何在 C++ 中打印动态数组我需要解释这个问题【英文标题】:how can I print dynamic array in c++ I need explanation to this question 【发布时间】:2021-05-08 21:50:15 【问题描述】:

这是我老师给我的问题

构造一个由以下字段组成的结构EmployeeID, name, degree, age 创建一个对象(Employee 类型的变量)的函数,从用户那里填充它,然后返回它。 接收对象(Employee 类型的变量)并打印其字段的函数。 主函数内部: 要求用户指定员工人数。 为员工创建用户指定大小的动态数组。 在循环中,通过调用第一个函数一次填充一个数组元素。 在另一个循环中,通过调用第二个函数一次打印一个数组元素。

虽然我不明白,但我试图解决它,这就是我所拥有的,请帮助:

struct Employee

    int ID;
    char name[10];
    char degree;
    int age;

;

int fillin()
   Employee employee;
    cout<<"Enter employee ID, NAME, DEGREE and AGE:\n";
    cin>>employee.ID;
    cin>>employee.name;
    cin>>employee.degree;
    cin>>employee.age;



int print()

    Employee employee;
    cout<<"ID: "<< employee.ID<<" , ";
    cout<<"NAME: "<< employee.name<<" , ";
    cout<<"Degree: "<< employee.degree<<" , ";
    cout<<"AGE: "<< employee.age<<".\n ";


int main()

    int num;
    cout<<"Enter number of employees: ";
    cin>> num;

   string *name= new string[num];

    for(int i = 0; i < num;i++)
    
      name[i]=fillin();
    


    for(int j : name)
        print();
    
    return 0;

【问题讨论】:

和普通数组一样。 10 似乎是名称字段的缩写,而 1 个字符似乎是奇怪的学位。 您需要为print 提供论据并为fillin 提供正确的返回类型 对于初学者,你需要创建一个Employee而不是string的数组:Employee * employees = new Employee[num]; 也可以使用std::vector 【参考方案1】:

一个函数可以有参数并返回一个值。所以在这里,fillin 应该返回一个Employee 对象,而print 应该接受一个Employee(或者更好的是一个常量引用)参数:

Employee fillin()
   Employee employee;
    cout<<"Enter employee ID, NAME, DEGREE and AGE:\n";
    cin>>employee.ID;
    cin>>employee.name;
    cin>>employee.degree;
    cin>>employee.age;
    return employee;      // return the local object


void print(const Employee& employee)

    cout<<"ID: "<< employee.ID<<" , ";
    cout<<"NAME: "<< employee.name<<" , ";
    cout<<"Degree: "<< employee.degree<<" , ";
    cout<<"AGE: "<< employee.age<<".\n ";

你的主要功能可能变成:

int main()

    int num;
    cout<<"Enter number of employees: ";
    cin>> num;

   Employee *name= new Employee[num];

    for(int i = 0; i < num;i++)
    
      name[i]=fillin();
    


    for(int i=0; i<num; i++)
        print(name[i]);
    
    return 0;

当然,您应该检查输入法是否返回有效值(每次读取后检查cin

【讨论】:

【参考方案2】:

代码有几个问题,下面是工作示例。

函数应该以某种方式接收和返回参数,代码中使用了引用 数组应该是合适的类型 使用了错误的迭代器

但是,请记住,代码还有更多问题,比如没有边界检查,最好使用 STL 库...将此作为起点。

#include <iostream>

using namespace std;

struct Employee

    int ID;
    char name[10];
    char degree;
    int age;

;

int fillin(Employee& employee)
   
    cout<<"Enter employee ID, NAME, DEGREE and AGE:\n";
    cin>>employee.ID;
    cin>>employee.name;
    cin>>employee.degree;
    cin>>employee.age;


int print(const Employee& employee)

    cout<<"ID: "<< employee.ID<<" , ";
    cout<<"NAME: "<< employee.name<<" , ";
    cout<<"Degree: "<< employee.degree<<" , ";
    cout<<"AGE: "<< employee.age<<".\n ";


int main()

    int num;
    cout<<"Enter number of employees: ";
    cin>> num;

    Employee *emp= new Employee[num];

    for(int i = 0; i < num;i++)
    
      fillin(emp[i]);
    


    for(int j = 0; j< num; j++)
        print(emp[j]);
    
    return 0;

【讨论】:

【参考方案3】:
Employee fillin()
    
        Employee employee;
        cout << "Enter employee ID, NAME, DEGREE and AGE:\n";
        cin >> employee.ID;
        cin >> employee.name;
        cin >> employee.degree;
        cin >> employee.age;

        return employee;
    

void print(Employee emp)
    
        cout << "ID: " << emp.ID << " , ";
        cout << "NAME: " << emp.name << " , ";
        cout << "Degree: " << emp.degree << " , ";
        cout << "AGE: " << emp.age << ".\n ";
    

这应该有助于您走上正轨。您只需要动态数组来接受 Employee 对象,然后您需要在 main 中调用 print(someEmployeeObject) 时提供要打印的对象。

【讨论】:

【参考方案4】:

好的,我在您的代码中有各种 cmets。首先,不要使用字符数组。改用字符串:

#include <string>

struct Employee

    int ID;
    std::string name;
    char degree;
    int age;
;

String 允许使用动态长度的字符串,因此如果有人输入一个非常非常长的名称,您不会超出空间。它只会处理它。此外,还有许多其他优势。

接下来,让我们稍微改变一下这个方法:

Employee fillin() 
    Employee employee;
    cout<<"Enter employee ID, NAME, DEGREE and AGE:\n";
    cin>>employee.ID;
    cin>>employee.name;
    cin>>employee.degree;
    cin>>employee.age;
    return employee;

您根本没有退回任何东西,但您需要退回您正在创建的员工。所以这是一个小改动。

现在对打印方法做一个小改动:

#include <iostream>

std::ostream & operator<<(std::ostream &ostr, const Employee &employee) 

    ostr <<"ID: "<< employee.ID<<" , ";
    ostr <<"NAME: "<< employee.name<<" , ";
    ostr <<"Degree: "<< employee.degree<<" , ";
    ostr <<"AGE: "<< employee.age<<".\n ";
    return ostr;

然后使用它:

std::cout << employee;

这是执行此操作的 C++ 方法,如果您想将员工转储到其他地方(如文件),您可以使用完全相同的方法。

最后,对你的 main 进行一些小改动:

#包括 主函数() std::vector 员工; 整数; cout>数;

for(int i = 0; i < num;i++)

    employees.push_back(fillin());


for (const Employee &employee: employees) 
    std::cout << employee;


return 0;

让我们谈谈这个。首先,我们使用的是向量,而不是使用固定长度的数组。这是一个动态长度数组,类似于 string 是动态长度字符串的方式。您可以 push_back() 将项目附加到数组中。定义它时,您指定它包含的内容。所以在这种情况下,我有一个 Employee 对象的向量。

我从你的 for 循环开始,但我调用新版本的 fillin 来实际获取员工记录,然后将它们推送到向量中。

然后是第二个 for 循环。你可能不熟悉这种风格。基本上,这是一个遍历员工每个元素的 for 循环——我们刚刚执行 push_back() 的那些元素。然后我使用我之前写的输出方法。

你很亲密。你只是遗漏了一些关键的东西——基本上是把元素传递给你的方法并返回元素。

【讨论】:

以上是关于如何在 C++ 中打印动态数组我需要解释这个问题的主要内容,如果未能解决你的问题,请参考以下文章

C++ 中的静态数组与动态数组

C++中动态二维数组中的地址

c++中的动态二维数组和内存泄漏

如何删除动态数组?

什么是 C++ 中的动态内存分配?

什么是 C++ 中的动态内存分配?