C++ - 当我使用 sprintf() 函数时程序崩溃(std::cout 工作正常)
C++ - Program crashes when I use sprintf() function (std::cout works fine)
我正在使用 RakNet 联网我的程序,我想在运行时获得一些网络统计信息。幸运的是,RakNet 为此有两个内置函数。 GetStatistics() and 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);
我正在使用 RakNet 联网我的程序,我想在运行时获得一些网络统计信息。幸运的是,RakNet 为此有两个内置函数。 GetStatistics() and 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);