将 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()));
或者,您可以简单地将 result
从 std::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
。
我正在尝试转换通过一些数据操作获得的 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()));
或者,您可以简单地将 result
从 std::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
。