[英]C++ convert std::string to char
我有以下情况:
struct MyStruct
{
char name[25];
char address[12];
}
Somewhere::SomeMethod(std::shared_ptr<SomeArgumentClass> args)
{
// GetName() and GetAddress() both return std::strings
::MyStruct newValue = {args->GetName(), args->GetAddress()};
// add newValue to some structure that needs to have chars
}
错误:
error C2440: 'initializing' : cannot convert from 'std::string' to 'char'
error C2440: 'initializing' : cannot convert from 'std::string' to 'char'
我无法将std :: string转换为char。
非常感谢!
首先,您的术语不正确。 您不想转换为char
,这是一个字符。 我意识到错误消息声称您正在尝试转换为char
,但这是因为您的错误代码使编译器误以为您正在尝试初始化数组name
各个元素。 当您编写错误的代码时,请警惕错误消息的细节,因为编译器无法理解您的想法,它只会超出您编写的内容!
实际上,您要将std::string
的字符复制到char
数组中,该数组就是您的成员。
像这样:
Somewhere::SomeMethod(std::shared_ptr<SomeArgumentClass> args)
{
const auto& name = args->GetName();
const auto& address = args->GetAddress();
::MyStruct newValue;
std::copy(std::begin(name), std::end(name), &newValue.name[0]);
std::copy(std::begin(address), std::end(address), &newValue.address[0]);
// add newValue to some structure that needs to have chars
}
但是您也需要添加边界检查。 为此,大概我可以考虑将每个std::copy
调用替换为:
std::copy_n(
&name[0],
std::min(name.size(), sizeof(newValue.name)),
&newValue.name[0]
);
您还需要一些空终止,具体取决于复制了多少个字符。
通常,尽管突出的一点是您需要实际复制那些字符,因为没有单步执行方法。 这部分是由于无法分配数组的原因,也源于数组的维是该类型的一部分,这使事情变得更加复杂。
如果这看起来有点麻烦,那是因为它是-理想情况下,您应该坚持使用std::string
,因为它要优越得多,并且专门引入它是为了使其更易于处理char
数组。 您仍然可以将指向字符串数据的const char*
(或char*
!)传递给C API。 当然,如果::MyStruct
本身是第三方C类型,则您别无选择,只能用困难的方式做到。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.