将std :: string转换为char *替代

时间:2011-04-11 10:59:08

标签: c++ string pointers char

我在google中进行了搜索并被告知这是不可能的,因为我只能从字符串中获取静态char *,所以我正在寻找替代方案。

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

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

我可以访问此功能,但它使用char *调用另一个函数,所以我认为我使用了char *

有没有人知道某种工作或其他方式吗?

5 个答案:

答案 0 :(得分:12)

在C ++中,如果需要非const char*,我总是会执行以下操作:

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

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

答案 1 :(得分:6)

您可以使用const char*获取c_str字符串:

std::string str = "foo bar" ;
const char *ptr = str.c_str() ;

如果你只需要一个char *,你必须复制一份,例如这样做的:

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

答案 2 :(得分:2)

正如之前的海报所提到的,如果被调用的函数确实修改了字符串,那么你需要复制它。但是为了将来的参考,如果你只是处理一个旧的c风格的函数,它接受一个char *但实际上没有修改参数,你可以循环c_str()调用的结果。

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

答案 3 :(得分:1)

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

虽然不是static,但const。如果你的其他函数需要char*(没有const),你可以抛弃constness(警告!确保函数不修改字符串)或者创建一个本地副本作为codebolt建议。之后不要忘记delete副本!

答案 4 :(得分:0)

你不能只将字符串传递给带有char *的函数:

func(&string[0]);