将printf数据写入c ++ / cli中的字符串变量

时间:2012-07-04 03:43:54

标签: c++ string c++-cli

我需要将一个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中的字符串^。

4 个答案:

答案 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)

如果您正在编写新的托管代码,我意识到这不是要做的事情,但如果要移植与printfconst 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;
    }
  }
}