如何返回字符串数组?

时间:2011-03-31 16:58:05

标签: c++ arrays string return

我有功能:

int read_file() {
  ifstream file("plik");
  if(!file.is_open()) {
    throw -1;
  }
  int i = 0;
  string line[MAXSIZE];
  while(getline(plik, line[i])) {
    cout<<line[i]<<endl;
    i++;
  }

  return i; 
}

但我想返回字符串数组:

line[]

我该怎么做?

4 个答案:

答案 0 :(得分:14)

别。数组不可复制。

改为使用std::vector<std::string>

答案 1 :(得分:3)

如果你真的真的想要,你可以动态分配一个数组并返回一个指向该数组的指针:

std::string* getArray() 
{
  return (new std::string[10]);
}

但是你需要满足使用delete[]释放你分配的内存以避免内存泄漏。

问问自己:

  • 你的代码应该负责这样做?
  • 你会记得那个指针代表一个动态分配的数组,代码中的其他地方吗?
  • 如果你在程序周围传递指针并在另一段代码调用delete[]之后意外地使用它,会发生什么? (分段错误就是答案)。
  • 如果将指针传递给数组,那么使用该指针的代码如何知道数组的大小? std::vector为你保留物品的数量,所以没问题。

这就是为什么使用std::vector<std::string>是一个更好的主意。返回指向动态分配的数组的指针会引入各种问题,这些问题比解决的问题更好避免。

答案 2 :(得分:3)

标准8.3.5p6:

  

函数不应具有类型数组或函数的返回类型,尽管它们可能具有类型指针的返回类型或对此类事物的引用。

正如@Tomalak暗示的那样,对数组说“不要说”。如果你可以使用vector,它们通常可以避免各种各样的陷阱。

答案 3 :(得分:2)

我建议不要再回复std::vector<std::string>。相反,我会传递一个迭代器,并让函数将数据写入迭代器所指向的位置。这样,函数可以很好地将数据写入向量或双端队列,或者(如果需要)直接写入输出流。

使用它,你的功能接近于平凡:

// I've changed the definition slightly, to let you pass it a filename instead
// of hard-coding one.
//
template <class outIt>
void read_file(std::string const &filename, outIt output) { 
     std::ifstream in(filename);
     std::string line;

     while (std::getline(in, line))
         *output++ = line;
}

要使用此功能将数据复制到标准输出,大致与问题一样,您可以执行以下操作:

read_file("plik", std::ostream_iterator<std::string>(std::cout, "\n"));