我需要将一个fomatted数据发送到我的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);
我收到错误*错误C2664:'sprintf':无法将参数1从'System :: String ^'转换为char **
我想将它写入字符串变量 std :: string 。
有人可以提供一些建议。至少我将其转换为 System :: String ^ 。我可以使用此C++/CLI Converting from System::String^ to std::string将其转换为std:string。但我不知道如何将不同的数据类型写入c ++ / cli中的字符串^。
答案 0 :(得分:3)
您需要声明类型为char*
的时态变量。我在这里使用固定阵列进行演示。由于您可能有一个长字符串,我建议您查看_snprintf以避免缓冲区溢出错误。
在char*
中获取字符串后,您可以使用System::String
gcnew
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);
答案 1 :(得分:1)
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直接对其进行格式化
答案 2 :(得分:0)
您是否了解了sprintf在您的平台上的运作方式?
答案 3 :(得分:0)
如果您正在编写新的托管代码,我意识到这不是要做的事情,但如果要移植与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;
}
}
}