将std::string转换为char * alternative

Convert std::string to char * alternative

本文关键字:char alternative 转换 std string      更新时间:2023-10-16

我在谷歌做了一个搜索,被告知这是不可能的,因为我只能从一个字符串中得到一个静态的char *,所以我正在寻找一个替代方案。

情况如下:我有一个。txt文件,其中包含其他。txt文件的列表和一些数字,这样做是为了使程序可以在不重新编译的情况下添加。我使用ifstream将文件名读入字符串。

他们需要的功能是期望char *而不是string,显然这种转换是不可能的。

我可以访问这个函数,但它调用另一个函数与char *,所以我认为我卡住了使用char *

有谁知道这样做的工作或其他方法吗?

在c++中,如果需要非const char*,我总是这样做:

std::vector<char> buffer(str.length() + 1, '');
std::copy(str.begin(), str.end(), buffer.begin());
char* cstr = &buffer[0];

第一行创建了字符串的可修改副本,该副本保证驻留在连续的内存块中。第二行获取指向该缓冲区开头的指针。请注意,vector比字符串大一个元素,以适应null终止。

您可以使用c_str:

获得const char*到字符串
std::string str = "foo bar" ;
const char *ptr = str.c_str() ;

如果你只需要一个字符*,你必须复制,例如:

char *cpy = new char[str.size()+1] ;
strcpy(cpy, str.c_str());

正如之前的海报所提到的,如果被调用的函数实际上修改了字符串,那么你将需要复制它。但是,为了将来的参考,如果您只是处理旧的c风格函数,该函数接受char*,但实际上不修改参数,则可以对c_str()调用的结果进行const-cast。

void oldFn(char *c) { // doesn't modify c }
std::string tStr("asdf");
oldFn(const_cast< char* >(tStr.c_str());

如果您需要std::string的C兼容版本,则有c_str();。见http://www.cppreference.com/wiki/string/basic_string/c_str

它不是static,但const。如果你的其他函数需要char*(不需要const),你可以抛弃constness(警告!)确保函数不修改字符串)或像codebolt建议的那样创建一个本地副本。别忘了把副本delete !

不能直接将字符串传递给接受char*:

参数的函数吗?
func(&string[0]);