0

我尝试了下面的代码来返回一个包含所有字符串 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;
}
4

2 回答 2

4

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

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

不要忘记删除您在函数中分配的内存;目前你有一个很大的内存泄漏。

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

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

于 2013-05-22T21:20:08.633 回答
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;
}

std::vector但是,这不是一个最佳的 C++ 解决方案:使用数组而不是数组会更好,因为向量会动态增长,并且它的大小会与容器本身一起返回。也不需要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;
}
于 2013-05-22T21:20:53.587 回答