将 std:string 转换为 char*

Conversion of std:string to char*

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

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

我在 TDataModule 上从 getId()(其中 returns 一个 AnsiString)获取一个 ID,使用 [] 将其转换为 std::string =18=],并在我的 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并做一些验证。

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

candidate function not viable: no known conversion from 'std::string' (aka 'basic_string') to 'char *' for 1st argument

When I run the code, an error appears when I call this function:

candidate function not viable: no known conversion from 'std::string' (aka 'basic_string') to 'char *' for 1st argument

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

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

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

或者,您可以简单地使用 &result[0] 代替(在 C++11 和更高版本中保证是连续的 null-terminated),或者您可以在 C 中使用 result.data() ++17 及更高版本,例如:

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

或者,您可以简单地将 resultstd::string 更改为 AnsiString,因为它的 c_str() 方法 returns a non-const 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()as-is了,不用耍花招,不管result是一个AnsiString还是一个std::string