是否可以将std :: string的指针传递给期望** char的函数?函数需要一个** char来为它写一个值。
目前我正在做以下事情:
char *s1;
f(&s1);
std::string s2 = s1;
有没有短路?很明显,s2.c_str()不起作用,因为它返回 const *char
。
答案 0 :(得分:5)
这是处理这种功能的适当方式。你无法直接传递std::string
,因为虽然你可以将转换为C字符串,但它在内存中的布局不同,所以被调用的函数不知道在哪里放置它的结果
但是,如果可能,您应该重写该函数,以便std::string&
或std::string *
作为参数。
(另外,如果合适,请确保free()
或delete[]
C字符串。请参阅文档以了解f()
是否需要执行此操作。)
答案 1 :(得分:2)
不,那是不可能的。该函数会覆盖指针(s1)本身。您可以从字符串(& s2 [0])传入数据数组,但这只会覆盖当前保留的内容空间,而不是指针。
该函数还以某种方式为字符串分配内存。您可能还需要清理它。如果它有效,它将如何清理?
答案 2 :(得分:2)
你不能 - 字符串的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);
答案 3 :(得分:2)
是的,写一个包装函数/宏然后只使用它
答案 4 :(得分:1)
将字符串传递给函数的一种方法是使用字符串
std::string name;
作为对象的数据成员。然后,在f()
函数中创建一个类似于你所做的字符串,然后像你展示的那样通过引用传递它
void f( const std::string & parameter_name ) {
name = parameter_name;
}
现在,要将字符串复制到char *,以便将其作为char引用传递给函数:
从此link:
如果你想获得像{* 1}}这样的可写副本,就像char *一样,你可以这样做:
str.c_str()
以上并非例外安全!
然后,您可以通过引用将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 * writable
函数中。