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