vsnprintf_s和_vsnprintf_s有什么区别

尼古拉斯赵六 2010-09-21 11:26:40
下面的代码经过我测试 运行后得到的结果是一样的 但是我没搞明白vsnprintf_s和_vsnprintf_s有什么区别?
_TRUNCATE的定义是#define _TRUNCATE ((size_t)-1) 又是什么含义?
望达人赐教


bool f(char *lpFmt, ... )
{
va_list arglist;
va_start( arglist, lpFmt );
vsnprintf_s( buff,sizeof(buff),_TRUNCATE, lpFmt, arglist );
va_end( arglist );
...
}



bool f(char *lpFmt, ... )
{
va_list arglist;
va_start( arglist, lpFmt );
_vsnprintf_s( buff,sizeof(buff), lpFmt, arglist );
va_end( arglist );
...
}
...全文
5705 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
尼古拉斯赵六 2010-09-29
  • 打赏
  • 举报
回复
11楼的朋友抽空用我发的测试代码测试一下 看看哪个会出问题就一目了然了

文档很多时候只做引导作用 并不能解决实际问题

结贴了
olncy 2010-09-25
  • 打赏
  • 举报
回复
_vsnprintf_s( buff, sizeof(buff), lpFmt, arglist );
vsnprintf_s( buff,sizeof(buff),_TRUNCATE, lpFmt, arglist );

这两句都有溢出的问题吧,查一下就知道了

所以_vsnprintf_s更安全,最起码在溢出的时候有内存泄露提示
尼古拉斯赵六 2010-09-25
  • 打赏
  • 举报
回复
main 忘记加返回值了 凑合看吧 意思已经说明白了
尼古拉斯赵六 2010-09-25
  • 打赏
  • 举报
回复
今天又遇到这个问题 我给大家一段测试代码 大家可以测试一下 这2个函数是有区别的 相对来说vsnprintf_s比_vsnprintf_s更安全


//以下代码会内存泄露 程序发生错误退出
void OutputString( char *lpFmt, ... )
{
char buff[1024];
va_list arglist;
va_start( arglist, lpFmt );
_vsnprintf_s( buff, sizeof(buff), lpFmt, arglist );
va_end( arglist );
::OutputDebugString(buff);
}

int main()
{
char str[2048];
memset(str,'a',sizeof(str));
OutputString("test:%s",str);
}



//修正使用vsnprintf_s 程序运行正常
void OutputString( char *lpFmt, ... )
{
char buff[1024];
va_list arglist;
va_start( arglist, lpFmt );
vsnprintf_s( buff,sizeof(buff),_TRUNCATE, lpFmt, arglist );
va_end( arglist );
::OutputDebugString(buff);
}

int main()
{
char str[2048];
memset(str,'a',sizeof(str));
OutputString("test:%s",str);
}
某某9 2010-09-22
  • 打赏
  • 举报
回复
查MSDN
没啥区别
zhsp1029 2010-09-22
  • 打赏
  • 举报
回复
不记得在哪里看到的,说是函数前面加下划线的,都是此函数的线程安全版本,原来函数不是线程安全的。
尼古拉斯赵六 2010-09-22
  • 打赏
  • 举报
回复
但我不得不说的是 用同一份代码 编译的2个EXE 一个使用_vsnprintf_s 另外一个使用vsnprintf_s

则使用_vsnprintf_s偶尔会发生内存泄露

而使用vsnprintf_s则不会

所以我很想知道原理

如果2个API是一模一样的话 不可能产生这个差异的

求达人赐教
尼古拉斯赵六 2010-09-22
  • 打赏
  • 举报
回复
但是程序编译后 执行会有区别

首先 我可以保证
1 编译的2个EXE只有这1个地方不同
2 其他地方都使用_s的安全方法 而且程序结构简单 暂时可以排除其他位置引发错误的可能
3 程序经过长时间多台计算机测试得到的结果

求达人赐教
visualwind 2010-09-21
  • 打赏
  • 举报
回复
这两个函数应该没什么区别。
#define _TRUNCATE ((size_t)-1) 是将_TRUNCATE定义成size_t这种类型的最大值,LZ单步跟一下就能看到。
job82824 2010-09-21
  • 打赏
  • 举报
回复
加下划线可能为了一致,就是和其它的同类函数名保持一致吧
pengzhixi 2010-09-21
  • 打赏
  • 举报
回复
查了MSDN,这两个函数没区别
rach09 2010-09-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 visualwind 的回复:]
这两个函数应该没什么区别。
#define _TRUNCATE ((size_t)-1) 是将_TRUNCATE定义成size_t这种类型的最大值,LZ单步跟一下就能看到。
[/Quote]
vsnprintf_s和_vsnprintf_s没有多少区别只是和以前的相兼容
可以互用

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧