C++ 将std::string传递给函数f(**char)
是否可以将std::string的指针传递给需要**字符的函数?函数需要**字符才能向其写入值 目前我正在做以下工作:C++ 将std::string传递给函数f(**char),c++,string,pointers,C++,String,Pointers,是否可以将std::string的指针传递给需要**字符的函数?函数需要**字符才能向其写入值 目前我正在做以下工作: char *s1; f(&s1); std::string s2 = s1; 没有捷径了吗?很明显,s2.c_str()不起作用,因为它返回const*char不,这是不可能的。该函数覆盖指针(s1)本身。可以从字符串(&s2[0])传入数据数组,但这只允许覆盖当前保留的内容空间,而不允许覆盖指针 该函数还以某种方式为字符串分配内存。你可能也需要清理一下。如果它起作用
char *s1;
f(&s1);
std::string s2 = s1;
没有捷径了吗?很明显,s2.c_str()不起作用,因为它返回const
*char
不,这是不可能的。该函数覆盖指针(s1)本身。可以从字符串(&s2[0])传入数据数组,但这只允许覆盖当前保留的内容空间,而不允许覆盖指针
该函数还以某种方式为字符串分配内存。你可能也需要清理一下。如果它起作用了,怎么清理呢?这是处理这类功能的合适方法。不能直接传入
std::string
,因为虽然可以将其转换为C字符串,但它在内存中的布局不同,因此被调用的函数不知道将其结果放在何处
但是,如果可能,您应该重写该函数,使其以std::string&
或std::string*
作为参数
(另外,如果合适,请确保
free()
或delete[]
C字符串。请参阅文档,了解f()
确定是否需要这样做。)将字符串传递到函数中的一种方法是使用字符串
std::字符串名称代码>
作为对象的数据成员。然后,在f()
函数中,像您那样创建一个字符串,并像您显示的那样通过引用传递它
void f( const std::string & parameter_name ) {
name = parameter_name;
}
现在,要将字符串复制到char*以便将其作为char引用传递到函数中,请执行以下操作:
由此:
如果您想获得可写副本,如str.c_str()
,如char*,您可以使用以下方法:
std::string str;
char * writable = new char[str.size() + 1];
std::copy(str.begin(), str.end(), writable);
writable[str.size()] = '\0'; // don't forget the terminating 0
// don't forget to free the string after finished using it
delete[] writable;
以上都不例外安全
然后,您可以通过引用将char*writeable
传递到f()
函数中。您不能-字符串的char缓冲区不可写,您不应该这样做。您始终可以使用中间缓冲区:
const size_t n = s2.size();
char buf[n + 1];
buf[n] = 0;
std::copy(s2.begin(), s2.end(), buf);
f(&buf);
s2.assign(buf, n);
是的,编写一个包装函数/宏,然后使用它您也可以得到一个指向字符串内容的指针。要求是确保它足够大,并且当它改变大小时,指针的有效性会下降。预约使用。