从传递参数的函数返回char数组

时间:2015-12-10 10:15:39

标签: c++

我正在处理一段C ++代码,该代码从txt文件中读取行,然后将每行分配给名为array的{​​{1}}。然后它调用一个函数,将lines数组中的每个元素转换为lines,然后返回结果char array。这一步是我卡住的地方。如何从函数char array返回char array并将返回的数组分配给另一个toChar,以便我可以根据需要使用它? (其余的代码应该使用每个返回的array将它写在管道中,这现在不重要,只是为了澄清为什么我需要学习从函数返回一个数组)

以下是我使用的代码:

char array

请注意,在此代码中,我尝试缩小代码,以便为数组分配一个简单的#include <fstream> #include <iostream> #include <string.h> #include <unistd.h> #include <cstdlib> using namespace std; char * toChar(string line); int main() { string lines[0] = "line1"; char* a = toChar(lines[0]); return 0; } char * toChar(string line) { char a[1024]; strcpy(a, line.c_str()); return a; }

当我尝试编译此代码时,会出现以下错误:

  

警告:本地变量的地址&#39; a&#39;返回

非常感谢任何帮助或建议。

3 个答案:

答案 0 :(得分:3)

首先使用const &将字符串传递给函数以避免不必要的复制,并且能够使用临时值,例如toChar("I am temp");

以下是替代方案:

  

(1)返回std :: string

 std::string toChar(std::string const & line)
 {
     char a[1024];
     strcpy(a, line.c_str());
     return a;
 }

当然假设line小于1024个字符且带有空终止符号

  

(2)返回分配的数组

char * toChar(std::string const & line)
{
  char * a = new char[1024];
  strcpy(a, line.c_str());
  return a;
}

但你必须实际管理它并在以后删除它。

  

(3)分配数组并将其传递给函数

void toChar(string const & line, char a[])
{
 strcpy(a, line.c_str());
}

我想你实际上想要从std :: string或它的某些部分提取一个C字符串。正确的方法是(3)。

答案 1 :(得分:1)

警告是正确的,实际上是一个错误。您在本地声明char数组,因此在超出该函数的范围后将被删除,并且其地址将不再有效。

由于您使用c ++避免使用char数组并使用std::string

答案 2 :(得分:1)

如果您想要访问字符串的内部存储空间,可以致电line.c_str(),并返回const char *

因此,您不需要函数toChar来创建一个在函数末尾超出范围的本地数组。

你可以这样做:

int main()
{
    string lines[0] = "line1";
    const char* a = lines[0].c_str();


    return 0;
}

但我建议你继续操纵std::string,因为它们会比简单的char *更好地处理字符串。 如果你想要一份副本,就这样做:std::string mycopy = lines[0]