将C++字符串写入char*

Ter*_* Li 5 c++ string

可能重复:
将std :: string转换为const char*或char*

void setVersion(char* buf, std::string version) {
  buf = version;
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试将版本字符串写入buf,但上面的代码给了我这个错误"无法将'std :: string {aka std :: basic_string}'转换为'char*'的赋值".

修复它的最简单方法是什么?

hmj*_*mjd 13

假设buf至少是version.length() + 1字节大小:

strcpy(buf, version.c_str());
Run Code Online (Sandbox Code Playgroud)

  • @JamesKanze,我暗示这是OP的责任. (4认同)
  • @JamesKanze:是的,你可以.由于调用者是传递指针和字符串的人,因此确保字符串的长度不超过缓冲区的大小是他的责任. (3认同)

Jam*_*nze 5

首先,界面存在严重问题,因为您不知道界面有多大buf.不知道这一点,你无法正确地写任何东西.如果你通过了这个长度,你可以做类似的事情:

void
setVersion( char* buffer, size_t size, std::string const& version )
{
    size_t n = version.copy( buffer, size - 1 );  // leave room for final '\0'
    buffer[ n ] = '\0';
}
Run Code Online (Sandbox Code Playgroud)

另一种可能性是你的意图是设置一些全局指针; 给定的接口不能这样做,因为你有一个指针的副本,但如果给你一个引用,你可能会这样做:

void
setVersion( char*& buffer, std::string const& version )
{
    if ( buffer != NULL ) {
        delete [] buffer;
    }
    buffer = new char[ version.size() + 1 ];
    size_t n = version.copy( buffer, std::string::npos );
    buffer[ n ] = '\0';
}
Run Code Online (Sandbox Code Playgroud)

(其他版本是可能的,但您必须复制字符串,以避免生命周期问题.)