我正在处理一段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;返回
非常感谢任何帮助或建议。
答案 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]
。