在 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】:

我意识到,如果您正在编写新的托管代码,那么这不是实现方式,但如果您要移植适用于 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;
    
  

【讨论】:

【参考方案4】:

您是否了解过sprintf 在您的平台上的工作方式?

【讨论】:

以上是关于在 c++/cli 中将 printf 数据写入字符串变量的主要内容,如果未能解决你的问题,请参考以下文章

如何c语言中如何将print信息写入一个文件

如何在不同线程的 C++/CLI 中将图像数据从 BitmapSource (WPF) 复制到 cv::Mat (OpenCV)?

是否需要在 C 中将'\n' 提供给 printf()?

如何在 C 中将 linux syslog 映射到 printf

如何在Excel表格中将系统导出的部门的代码,用公式或者vba转换成文字?

如何在 C 中将动态分配的 3D 数组写入 hdf5 文件?