C++ - 当我使用 sprintf() 函数时程序崩溃(std::cout 工作正常)

标签 c++ printing crash printf raknet

我正在使用 RakNet 将我的程序联网,我想在运行时获取一些网络统计信息。幸运的是,RakNet 为此有两个内置函数。 GetStatistics()StatisticsToString() .但是,当我调用 StatisticsToString() 函数(StatisticsToString 只是应该使用 sprintf 函数将统计数据转换为字符串)时程序崩溃了,我完全不知道为什么......没有错误... 没有什么。我修改了该函数的源代码,并将 sprintf() 函数替换为 std::cout,程序运行良好,正如预期的那样。

我编写统计数据的自定义函数:

void HavNetProfiler::WriteStats(RakNet::RakPeerInterface *peer)
{

  if (RakNet::GetTimeMS() > nextStatTime)
  {
    nextStatTime = RakNet::GetTimeMS() + 1000;
    RakNet::RakNetStatistics rns;
    char *text;

    peer->GetStatistics(peer->GetSystemAddressFromIndex(0), &rns);
    RakNet::StatisticsToString(&rns, text, 0);
    //printf("%s\n\n", text);
  }

StatisticsToString() 函数的源代码片段:

void RAK_DLL_EXPORT RakNet::StatisticsToString( RakNetStatistics *s, char *buffer, int verbosityLevel )
{
    if ( s == 0 )
    {
        sprintf( buffer, "stats is a NULL pointer in statsToString\n" );
        return ;
    }

    if (verbosityLevel==0)
    {
        sprintf(buffer,
            "Bytes per second sent     %" PRINTF_64_BIT_MODIFIER "u\n"
            "Bytes per second received %" PRINTF_64_BIT_MODIFIER "u\n"
            "Current packetloss        %.1f%%\n",
            (long long unsigned int) s->valueOverLastSecond[ACTUAL_BYTES_SENT],
            (long long unsigned int) s->valueOverLastSecond[ACTUAL_BYTES_RECEIVED],
            s->packetlossLastSecond*100.0f
            );

      //Modified std::cout solution
      /*std::cout << "\nB/s sent: " << (long long unsigned int) s->valueOverLastSecond[ACTUAL_BYTES_SENT] 
        << "\nB/s recieved: " << (long long unsigned int) s->valueOverLastSecond[ACTUAL_BYTES_RECEIVED]
        << "\nCurrent packetloss: " << s->packetlossLastSecond*100.0f << "\n"
        << std::flush;*/
    }

std::cout 解决方案是临时的,因为我不想编辑 RakNet 的源代码。我只需要你的帮助来弄清楚为什么 sprintf 不能按预期工作。我是 C++ 的新手,所以也许我在这里遗漏了一些非常明显的东西。我不知道……

谢谢!

最佳答案

sprintf(buffer,...) 其中 buffer 应该足够大以包含结果字符串。

你需要这样的东西:

char text[1000];
RakNet::StatisticsToString(&rns, text, 0);

关于C++ - 当我使用 sprintf() 函数时程序崩溃(std::cout 工作正常),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49308810/

相关文章:

c++ - 垒球 C++ 问题 : How to compare two arrays for equality?

html - 当内容在多个页面上时,CSS 打印自定义大小的页边距

css - 打印样式表,一页打印并剪掉剩余的文本

objective-c - Xcode 5不导入崩溃文件?

c++ - 指定初始值设定项中参数列表的大括号数量

c++ - 取消声明函数中使用的结构成员?

ios - 此类对于 key screenNumber 不符合键值编码

python - 在MacOSX 10.6.8 Snow Leopard中,Python 3.4 IDLE无法正常工作,启动编辑器时会崩溃

c++ - 即使不知道元素的确切数量,也要调用 QVector::reserve 吗?

css - 媒体 ="print"外部链接不起作用