在 c++/cli 中将 printf 数据写入字符串变量
Posted
技术标签:
【中文标题】在 c++/cli 中将 printf 数据写入字符串变量【英文标题】:writing printf data to a string variable in c++/cli 【发布时间】:2012-07-04 03:43:54 【问题描述】:我需要在我的 c++/cli 程序中将格式数据发送到 tcp ip 端口。我有这段代码没有成功
String^ data;
sprintf(data,"L,%02u%02u%02u%02u%02u%02u%03u,%lf %lf\n",rDateTime.uiYear, rDateTime.usiMonth, rDateTime.usiDay,
rDateTime.usiHour, rDateTime.usiMinute, rDateTime.usiSec,
rDateTime.udiUSec / 1000,container[i].first,container[i].second);
我收到错误 *error C2664: 'sprintf' : cannot convert parameter 1 from 'System::String ^' to char **
我想将它写入一个字符串变量std::string。
谁能提供一些建议。如果至少我将其转换为 System::String^。我可以使用 C++/CLI Converting from System::String^ to std::string 将其转换为 std:string。但我不知道如何在 c++/cli 中将不同的数据类型写入字符串^ ..
【问题讨论】:
sprintf
如果它在 cli 中,可能就是你要找的东西。
你考虑过System::String::Format吗?
@chris.. 我之前尝试过,并相应地编辑了我的问题
sprintf() 是一个原生 C 库函数,它需要一个 char[] 作为第一个参数。 System::String 不是 char[]。使用 char[] 并转换为 String 或使用 String::Format()。如果您打算编写更多 C++/CLI 代码,则应该加快复合字符串格式化的速度。
@HansPassant 我可以给出一些示例代码吗?我刚刚开始使用 c++/cli。
【参考方案1】:
您需要声明一个类型为char*
的临时变量。我在这里使用固定数组进行演示。由于您的字符串可能很长,建议您查看_snprintf以避免缓冲区溢出错误。
在char*
中获取字符串后,您可以使用gcnew
创建托管System::String
char str[1024];
sprintf(str,"L,%02u%02u%02u%02u%02u%02u%03u,%lf %lf\n",rDateTime.uiYear, rDateTime.usiMonth, rDateTime.usiDay,
rDateTime.usiHour, rDateTime.usiMinute, rDateTime.usiSec,
rDateTime.udiUSec / 1000,container[i].first,container[i].second);
System::String^ data = gcnew System::String(str);
Console::WriteLine(data);
【讨论】:
【参考方案2】:sprintf() 函数将 char 数组 (char *
) 作为第一个参数。如果要这样使用,需要先写入char数组,再转成字符串。
我不知道System::String^
,但是您可以通过这样的简单分配将char数组转换为std::string
:
char * data = new char[50];
sprintf(data, "Your text goes here");
std::string str = data;
不要忘记为 char 数组分配内存!如果你忘记它并写这样的东西:
char * data;
sprintf(data, "Your text goes here");
你会得到一个错误。 另一方面,如果 std::string 适合你,你可以直接使用formatting manipulators格式化它
【讨论】:
【参考方案3】:我意识到,如果您正在编写新的托管代码,那么这不是实现方式,但如果您要移植适用于 printf
和 const char*
的非托管遗留 C++ 代码,则没有理由重写整个代码正确的事情。
这对我有用,并且应该安全地适用于任何大小的字符串。我用它来包装一些调用 Trace(...) 的函数,以便灵活地让委托的 Action 处理日志消息。
void TraceBase1(const char* prefix, const char* format, va_list argp)
if (Logger::m_logDelegate != nullptr)
System::String^ message;
int count = _vscprintf(format,argp) + 1;
char* buffer = new char[count ];
try
_vsnprintf(buffer,count,format,argp);
message = gcnew System::String(buffer);
Logger::m_logDelegate(message);
finally
delete[] buffer;
【讨论】:
【参考方案4】:您是否了解过sprintf 在您的平台上的工作方式?
【讨论】:
以上是关于在 c++/cli 中将 printf 数据写入字符串变量的主要内容,如果未能解决你的问题,请参考以下文章
如何在不同线程的 C++/CLI 中将图像数据从 BitmapSource (WPF) 复制到 cv::Mat (OpenCV)?
如何在 C 中将 linux syslog 映射到 printf