Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将std::string传递给函数f(**char)_C++_String_Pointers - Fatal编程技术网

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

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])传入数据数组,但这只允许覆盖当前保留的内容空间,而不允许覆盖指针 该函数还以某种方式为字符串分配内存。你可能也需要清理一下。如果它起作用

是否可以将std::string的指针传递给需要**字符的函数?函数需要**字符才能向其写入值

目前我正在做以下工作:

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);

是的,编写一个包装函数/宏,然后使用它

您也可以得到一个指向字符串内容的指针。要求是确保它足够大,并且当它改变大小时,指针的有效性会下降。预约使用。