繁体   English   中英

C ++将std :: string转换为char

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM