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

时间:2018-03-15 20:40:44

标签: 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 ++很新,所以也许我错过了一些非常明显的东西。我不知道......

谢谢!

1 个答案:

答案 0 :(得分:2)

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

您需要以下内容:

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