0

我需要在我的 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 中将不同的数据类型写入字符串^ ..

4

4 回答 4

3

您需要使用 type 声明一个临时变量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);
于 2012-07-04T06:31:16.500 回答
1

sprintf()函数将 char 数组 ( )char *作为它的第一个参数。如果要这样使用,需要先写入char数组,再转成字符串。我不知道,但是您可以通过像这样的简单分配System::String^将 char 数组转换为 an :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 适合您,则可以直接使用格式化操纵器对其进行格式化

于 2012-07-04T06:23:24.927 回答
1

我意识到,如果您正在编写新的托管代码,这不是这样做的方法,但是如果您要移植与printfand一起使用的非托管遗留 C++ 代码,const char*则没有理由重写整个事情 Just To Be Right。

这对我有用,并且应该安全地适用于任何大小的字符串。我用它来包装一些调用 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;
    }
  }
}
于 2013-05-08T20:24:19.333 回答
0

您是否查看过sprintf在您的平台上的工作方式?

于 2012-07-04T03:46:09.907 回答