user2386222
user2386222

Reputation: 61

Return array from function in C++

I tried the code below to return an array with all string ids, but it didn't work. The output just returns a number. How can I return an array with ids?

#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;
}

Upvotes: 0

Views: 180

Answers (2)

Sergey Kalinichenko
Sergey Kalinichenko

Reputation: 726579

You do not need to read the number of elements twice, and the type of the anim should be string*, not string* []. Unfortunately, this wouldn't tell you the number of items in the array, so you need to get it from the getArray, for example, like this:

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;
}

This is not an optimal C++ solution, though: you would be much better off using std::vector instead of an array, because the vector grows dynamically, and its size is returned along with the container itself. There would be no need to delete[] the result either, which would significantly simplify your code:

#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;
}

Upvotes: 3

Bathsheba
Bathsheba

Reputation: 234715

You are returning a pointer to the first element in the array.

To access array elements just having called string* arr = getArray(); you can use arr[0], arr[1], arr[2] etc. to access the strings.

Don't forget to delete the memory you allocated in the function though; at the moment you have a big memory leak.

Generally this is not good programming though since the function caller doesn't know how many elements there are in the returned array. It would be better to get the number of animals in the caller and pass that into your function.

Better still, rebuild your code to use std::vector as I see you're already using stl. Then you don't need to worry (explicitly) about memory allocation and deallocation.

Upvotes: 4

Related Questions