string.c_str() is const?

string.c_str() is const?

本文关键字:is const str string      更新时间:2023-10-16

我在库中有一个函数,可以接收char*并修改数据。

我试图给它c_str()但 c++ 文档说它返回一个const char*

除了更新一个字符数组并将其复制到其中之外,我还能做什么?

您可以使用

&str[0]&*str.begin(),只要:

  • 你用resize()显式预分配函数所需的所有空间;
  • 该函数不会尝试超过预分配的缓冲区大小(您应该传递str.size()作为缓冲区大小的参数);
  • 当函数返回时,您在找到的第一个字符处显式修剪字符串,否则str.size()将返回"预分配大小"而不是"逻辑"字符串大小。

注意:这保证在 C++11 中有效(其中字符串保证是连续的),但在以前的标准修订版中不起作用;尽管如此,我所知道的标准库的实现从未实现过std::basic_string与非连续存储。

不过,如果你想安全起见,请使用std::vector<char>(保证自C++03以来是连续的);使用你想要的任何内容进行初始化(你可以使用接受两个迭代器的构造函数从字符串中复制其数据,最后添加一个空字符),像对待std::string一样调整它的大小,并将其复制回第一个字符的字符串。

什么都没有。

由于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.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 中得到保证,但在允许绳索实现(即非连续内存)的先前版本的标准中没有保证。

如果您的实现不会尝试增加字符串的长度,那么:

C++11:

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

这是一个类,它将生成一个临时缓冲区,并在字符串被销毁时自动将其复制到字符串中。

class 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++的临时寿命?