从C ++中的函数返回数组

时间:2013-05-22 21:16:55

标签: c++ arrays

我尝试使用下面的代码返回一个包含所有字符串ID的数组,但它不起作用。 输出只返回一个数字。如何返回带有ID的数组?

#include <iostream>
#include <string>
using namespace std;

string* getArray()
{   
    int nanim;
cout << "Enter the number of animals: ";
cin >> nanim;

string *id = new string[nanim];
for ( size_t i=0; i < nanim; i++ ) 
{
    cout<< "\nEnter id anim "<< i+1 << ": "; 
    cin >> id[i];
    }
    for ( size_t i = 0; i < nanim; i++ ) 
    {
    cout << id[i] << endl; 
    }
return id;
 }

  int main()
{
 int n;
 cin>>n;
    string* anim[n]=getArray();
cout<<anim;
return 0;
}

2 个答案:

答案 0 :(得分:4)

您正在返回指向数组中第一个元素的指针。

要访问刚调用string* arr = getArray();的数组元素,可以使用arr [0],arr [1],arr [2]等来访问字符串。

不要忘记删除在功能中分配的内存;目前你的内存泄漏很大。

通常这不是很好的编程,因为函数调用者不知道返回数组中有多少元素。最好在调用者中获取动物数量并将其传递给您的函数。

更好的是,重建代码以使用std :: vector,因为我看到你已经在使用stl了。然后你不必担心(显式)内存分配和释放。

答案 1 :(得分:3)

您不需要两次读取元素数量,anim的类型应为string*,而不是string* []。不幸的是,这不会告诉你数组中的项目数量,所以你需要从getArray获取它,例如,像这样:

string* getArray(int& nanim) {
    // Remove the declaration of nanim, and keep the rest of the code unchanged
    ...
}

int main()
{
    int n;
    string* anim = getArray(n);
    for (int i=0; i != n; i++) {
        cout << anim[i] << endl;
    }
    delete[] anim;
    return 0;
}

这不是一个最佳的C ++解决方案:使用std::vector而不是数组会更好,因为向量会动态增长,并且其大小会随容器本身一起返回。也不需要delete[]结果,这将显着简化您的代码:

#include <iostream>
#include <string>
#include <vector>
using namespace std;

vector<string> getVector()
{   
    int nanim;
    cout << "Enter the number of animals: ";
    cin >> nanim;
    vector<string> res;
    for ( size_t i=0; i < nanim; i++ ) 
    {
        cout<< "\nEnter id anim "<< i+1 << ": ";
        string tmp;
        cin >> tmp;
        res.push_back(tmp);
    }
    return res;
}

int main()
{
    vector<string> anim = getVector();
    for ( size_t i = 0; i < anim.size(); i++ ) 
    {
        cout << anim[i] << endl; 
    }
    return 0;
}