C++ 写C++;串成字符*

C++ 写C++;串成字符*,c++,string,C++,String,可能重复: 我试图将版本字符串写入buf,但上面的代码给了我这个错误“无法在赋值中将'std::string{aka std::basic_string}'转换为'char*” 最简单的修复方法是什么?尝试在版本之后添加对c_str()的调用: void setVersion(char* buf, std::string version) { buf = version.c_str(); } 假设buf的大小至少为version.length()+1字节: strcpy(buf, ve

可能重复:

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


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

尝试在版本之后添加对
c_str()
的调用:

void setVersion(char* buf, std::string version) 
{
  buf = version.c_str();
}

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

strcpy(buf, version.c_str());

确保buf有足够的空间来存储字符串

strcpy(buf,version.c_str())

首先,界面有一个严重的问题,因为你没有 知道
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';
}
另一种可能性是,您的目的是设置一些全局 指针;给定接口无法执行此操作,因为您有 指针,但如果向您提供了对它的引用,您可能会执行以下操作:

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';
}
(可以使用其他版本,但必须复制字符串,以避免
生命周期问题。)

如果您只需要std::string的char*,正如前面指出的,请使用vesrion.c_str()

如果确实要将其复制到单独的缓冲区中(对于您使用的函数签名),则应在调用函数之前分配缓冲区,并且缓冲区的大小应与version.size()+1相同

否则,您可以执行以下操作:

void setVersion ( char** out, std::string in ) {
    *out = new char[in.size() + 1];
    strcpy ( out, in.c_str() );
}

HTH

您的代码没有可观察到的行为。@BenjaminLindley这是什么意思?@BenjaminLindley您的意思是什么?@Hunter:使用strcpy,您正在复制指针指向的字符串。buf是调用站点上传入的任何指针的本地副本。即使它本身是本地的,它指向的对象仍然是它从中复制的指针指向的对象。如果您的假设是正确的,那么就不需要将char*作为参数。它应该在函数内部声明。此外,它需要声明为
const char*
-1您不能在正确的代码中做出这样的假设。@JamesKanze,我暗示这是OP的责任。@JamesKanze:是的,您可以。由于调用者是同时传递指针和字符串的人,因此确保字符串的长度不超过缓冲区的大小当然是调用者的责任。@BenjaminLindley在这种情况下,使用函数没有意义,因为调用者所做的工作比函数中所做的要多。
void setVersion ( char** out, std::string in ) {
    *out = new char[in.size() + 1];
    strcpy ( out, in.c_str() );
}