我有一个库中的函数,它接受一个 char*
并修改数据。
我尝试使用 c_str()
,但是 C++ 文档说它返回一个 const char*
。
除了新建一个 char 数组并将其复制到其中,我还能做什么?
我有一个库中的函数,它接受一个 char*
并修改数据。
我尝试使用 c_str()
,但是 C++ 文档说它返回一个 const char*
。
除了新建一个 char 数组并将其复制到其中,我还能做什么?
&str[0]
或者&*str.begin()
:
resize()
明确预分配函数所需的所有空间;str.size()
作为缓冲区大小的参数);\0
字符处修剪字符串,否则str.size()
将返回“预分配大小”而不是“逻辑”字符串大小。std::basic_string
。std::vector<char>
(自C++03以来保证是连续的);可以使用构造函数从字符串复制数据(采用接受两个迭代器的构造函数,在末尾添加一个空字符),像使用std::string
一样调整其大小,并在找到第一个\0
字符时将它复制回一个字符串。什么也没有。
因为std::string
自己管理其内容,您无法对字符串的底层数据进行写访问。那是未定义行为。
但是,创建和复制char数组并不难:
std::string original("text");
std::vector<char> char_array(original.begin(), original.end());
char_array.push_back(0);
some_function(&char_array[0]);
&str[0]
应该是明确定义的行为。 - Matteo Italiastd::string
的内容是连续的。 - user784668std::vector<char>
代替,它保证是连续的并且具有异常安全性。 - Matteo Italiastr.size()
的内容,那么可以通过以下方式之一获取指针:void f( char* p, size_t s ); // update s characters in p
int main() {
std::string s=...;
f( &s[0], s.size() );
f( &s.front(), s.size() );
}
请注意,在C++11中这是有保障的,但在标准的早期版本中允许rope实现(即非连续内存),则不保证。
std::string data = "This is my string.";
func(&*data.begin());
C++03:
std::string data = "This is my string.";
std::vector<char> arr(data.begin(), data.end());
func(&arr[0]);
func
将被调用,并传入一个未必以空字符结尾的字符串。 - Frerich Raabeclass StringBuffer
{
public:
StringBuffer(std::string & str) : m_str(str)
{
m_buffer.push_back(0);
}
~StringBuffer()
{
m_str = &m_buffer[0];
}
char * Size(int maxlength)
{
m_buffer.resize(maxlength + 1, 0);
return &m_buffer[0];
}
private:
std::string & m_str;
std::vector<char> m_buffer;
};
以下是如何使用它的方法:
// this is from a crusty old API that can't be changed
void GetString(char * str, int maxlength);
std::string mystring;
GetString(StringBuffer(mystring).Size(MAXLEN), MAXLEN);
如果你觉得你以前见过这段代码,那是因为我从我写的一个问题中复制了它:C++中临时变量的保证生命周期?
std::vector<char> buf(MAXLEN); GetString(&buf[0], MAXLEN); std::string s = &buf[0];
。 - Frerich Raabe
c_str()
调用变得昂贵或者打破所有假定字符串存储在连续内存中的代码。 - Matteo Italia21.4.5/2
中存在一些标点符号混淆。我相信“引用不得被修改”仅适用于pos == size()
的情况,但这一点并不清楚,因为分号通常比逗号具有更高的优先级。 - Steve Jessop