【问题标题】:Conversion of std:string to char* [closed]将 std:string 转换为 char* [关闭]
【发布时间】:2020-08-25 19:49:09
【问题描述】:

我正在尝试转换通过一些数据操作获得的result 字符串,例如:

std::string result = std::string(/* num_max */, '0').append(myDataModule->getId().c_str());

我在TDataModule 上从getId()(返回AnsiString)获得一个ID,使用AnsiString::c_str() 将其转换为std::string,并在左侧附加零(空格将保留)到我的result 字符串。

我需要在接收char *的函数中使用result的值:

void receiver(char * data, int num){
  ... <- A lot of code here

  if( data != NULL )
  {
    strcpy( rdData, data); <-- rdData is an char *
    ...
  }
}

基本上,在这个函数中它会将data复制到rdData并做一些验证。

运行代码时,调用这个函数时出现错误:

候选函数不可行:第一个参数没有从“std::string”(又名“basic_string”)到“char *”的已知转换

【问题讨论】:

标签: c++ c++builder rad-studio


【解决方案1】:

运行代码时,调用这个函数时出现错误:

候选函数不可行:第一个参数没有从“std::string”(又名“basic_string”)到“char *”的已知转换

您没有显示尝试将std::string 传递给receiver() 函数的实际代码,但错误消息非常清楚。您根本无法将std::string 直接分配给非常量char*,这正是编译器所抱怨的。

但是,您可以使用其c_str() 方法从std::string 获取const char*,然后您可以将const_cast 转换为char*(只要该函数不尝试修改@ 987654333@数据),例如:

std::string result = ...;
receiver(const_cast<char*>(result.c_str()), static_cast<int>(result.size()));

或者,您可以简单地使用 &amp;result[0] 代替(在 C++11 及更高版本中保证是连续且以空值结尾的),或者您可以在 C++17 及更高版本中使用result.data(),例如:

std::string result = ...;
receiver(&result[0]/*result.data()*/, static_cast<int>(result.size()));

或者,您可以简单地将resultstd::string 更改为AnsiString,因为它的c_str() 方法返回一个非常量char*,例如:

AnsiString result = AnsiString::StringOfChar('0', 8) + myDataModule->getId();
receiver(result.c_str(), result.Length());

无论哪种方式,如果receiver() 只需要从data 中读取而不修改其内容,那么应该改为将data 作为const char*(尤其是因为这就是strcpy() 所期望的),例如:

void receiver(const char * data, int num)

然后您可以按原样使用result.c_str(),无论resultAnsiString 还是std::string,都可以使用。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2014-11-08
  • 1970-01-01
  • 1970-01-01
  • 2016-06-10
  • 2015-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多