我们之前说过, snprintf类型不匹配, 容易导致core dump, 今天我们说点别的。
协议文件中定义了long, 经序列化后, 变成了C++中的long long, 然后在使用snprintf时候就没有严格匹配, 导致了天大的坑。 在繁杂的代码中排查好久, 逐步缩小范围, 才找到原因。
为了简便起见, 直接上代码:
#include <iostream>
#include <string>
using namespace std;
int main()
{
long long x = 1234;
char szBuf[128] = {0};
snprintf(szBuf, sizeof(szBuf), "haha%d,%s", x, "5678");
printf("%s\n", szBuf);
return 0;
} 我们大概以为结果是:
haha1234,5678
实际结果是:
haha1234,(null)
我们还可能以为, long long形式的x转成int形式的x, 不还是1234吗? 和int x有什么差别呢?
这种以为就太武断了, 历史经验告诉我们, 不要依赖于未定义的行为。
还是老老实实用%lld吧, 或者把long long强转为int. 关于snprintf, 也可查查源码。
遇到这种问题, 要用“最小化”和“”“对照”法来定位。

本文讲述了在C++中,由于snprintf函数参数类型不匹配,从long到long long的转换未严格处理,导致输出出现'(null)'的问题。通过代码示例展示了错误现象,并强调不应依赖未定义的行为。建议使用%lld格式化字符串或进行类型强转,同时推荐采用‘最小化’和‘对照’的调试方法来定位此类问题。
418

被折叠的 条评论
为什么被折叠?



