将std :: string传递给函数f(** char)

时间:2011-07-06 17:46:41

标签: c++ string pointers

是否可以将std :: string的指针传递给期望** char的函数?函数需要一个** char来为它写一个值。

目前我正在做以下事情:

char *s1;
f(&s1);
std::string s2 = s1;

有没有短路?很明显,s2.c_str()不起作用,因为它返回 const *char

5 个答案:

答案 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函数中。