C++ 将std::string转换为char*可选

C++ 将std::string转换为char*可选,c++,string,pointers,char,C++,String,Pointers,Char,我在谷歌上做了一次搜索,有人告诉我这是不可能的,因为我只能从字符串中得到一个静态的char*,所以我正在寻找替代方法 情况如下: 我有一个.txt文件,其中包含一个其他.txt文件和一些数字的列表,这样就可以添加程序而无需重新编译。我使用ifstream将文件名读入字符串 它们所需的函数需要的是char*而不是string,显然这种转换是不可能的 我可以访问这个函数,但它调用了另一个带有char*的函数,所以我想我一直在使用char* 有人知道一种变通方法或其他方法吗?难道不能将字符串这样传递给

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

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

它们所需的函数需要的是
char*
而不是
string
,显然这种转换是不可能的

我可以访问这个函数,但它调用了另一个带有
char*
的函数,所以我想我一直在使用
char*


有人知道一种变通方法或其他方法吗?

难道不能将字符串这样传递给接受char*的函数吗:

func(&string[0]);

不能将字符串本身传递给接受char*的函数吗:

func(&string[0]);

您可以使用
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_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_str()
如果您需要与C兼容的std::string版本。看

它不是静态的,而是常量的。如果您的其他函数需要
char*
(不带
const
),您可以丢弃constness(警告!确保函数不修改字符串),或者按照codebolt的建议创建本地副本。以后不要忘记删除副本

c_str()
如果您需要与C兼容的std::string版本。看


它不是静态的,而是常量的。如果您的其他函数需要
char*
(不带
const
),您可以丢弃constness(警告!确保函数不修改字符串),或者按照codebolt的建议创建本地副本。以后不要忘记删除副本 >代码> char */COD>,我将一直执行以下操作:

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

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

< p>,如果需要非代码> const <代码> char */COD>,我将总是执行以下操作:
std::vector<char> buffer(str.length() + 1, '\0');
std::copy(str.begin(), str.end(), buffer.begin());
char* cstr = &buffer[0];
std::向量缓冲区(str.length()+1',\0');
std::copy(str.begin()、str.end()、buffer.begin());
char*cstr=&缓冲区[0];

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

如前所述,如果调用的函数确实修改了字符串,则需要复制它。但是,为了便于将来参考,如果您只是处理一个接受char*但实际上没有修改参数的旧c风格函数,那么您可以const cast c_str()调用的结果

void oldFn(char*c){//不修改c}
标准::字符串tStr(“asdf”);
oldFn(const_cast(tStr.c_str());

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

void oldFn(char*c){//不修改c}
标准::字符串tStr(“asdf”);
oldFn(const_cast(tStr.c_str());

显而易见的问题是:您不能修改现有功能吗要获取一个
const char*
?如果这些函数不修改输入,那么它们真的应该是
const
@Oli。它确实修改了字符串,我担心这会带来麻烦。您希望更改在原始
std::string
中可见吗?@Oli程序读取这一个文件。其中是它所包含的所有文件的名称至于加载以便运行游戏。地图可以根据设计者的心血来潮添加或减去。只要函数得到它们,我就不会再使用它们,如果可以的话,我会将它们作为char*读入。显而易见的问题是:你不能修改你现有的函数吗要获取一个
const char*
?如果这些函数不修改输入,那么它们真的应该是
const
@Oli。它确实修改了字符串,我担心这会带来麻烦。您希望更改在原始
std::string
中可见吗?@Oli程序读取这一个文件。其中是它所包含的所有文件的名称至于加载以便运行游戏。地图可以根据设计者的心血来潮添加或减去。只要函数得到它们,我就不会再使用它们,如果可以的话,我会将它们读入char*。如果被调用函数修改其参数,这可能会造成严重破坏。这就是
std::string::c_str()是。但是这并不能避免非<代码> const 问题…我认为C和C++字符串被不同对待。@ Frank Schmitt:请解释一下这样的例子吗?假设函数按值使用<代码> char */COD>它不能修改参数(指针),并且无论它是否修改字符串的内容(只要它不超过字符串的结尾,可能还有大小作为第二个参数),这都应该是好的。这里唯一的灰色问题是