【发布时间】:2012-01-16 22:20:26
【问题描述】:
void setVersion(char* buf, std::string version) {
buf = version;
}
我正在尝试将版本字符串写入 buf,但上面的代码给了我这个错误“无法将 'std::string {aka std::basic_string}' 转换为 'char*' in assignment”。
最简单的修复方法是什么?
【问题讨论】:
void setVersion(char* buf, std::string version) {
buf = version;
}
我正在尝试将版本字符串写入 buf,但上面的代码给了我这个错误“无法将 'std::string {aka std::basic_string}' 转换为 'char*' in assignment”。
最简单的修复方法是什么?
【问题讨论】:
确保 buf 有足够的空间来存储字符串
strcpy(buf,version.c_str())
【讨论】:
如果您想要的只是 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
【讨论】:
首先,界面存在严重问题,因为您没有
知道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';
}
(其他版本也是可以的,但是你必须复制字符串,以避免 终生问题。)
【讨论】:
假设buf 的大小至少为version.length() + 1 字节:
strcpy(buf, version.c_str());
【讨论】:
尝试在版本之后添加对c_str()的调用:
void setVersion(char* buf, std::string version)
{
buf = version.c_str();
}
【讨论】:
const char *。