将C ++字符串写入char *

时间:2011-12-09 16:33:25

标签: c++ string

  

可能重复:
  Convert std::string to const char* or char*

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

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

解决它的最简单方法是什么?

5 个答案:

答案 0 :(得分:13)

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

strcpy(buf, version.c_str());

答案 1 :(得分: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';
}

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

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';
}

(其他版本是可能的,但你必须复制字符串,以避免 终身问题。)

答案 2 :(得分:3)

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

strcpy(buf,version.c_str())

答案 3 :(得分:2)

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

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

答案 4 :(得分:1)

如果你想要的只是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