一、函数原型

1、sprintf_s

int sprintf_s(

char *buffer,

size_t sizeOfBuffer,

const char *format[,argument]...);

int sprintf_s(

char (&buffer)[size],

const char *format[,argument]...);//C++only

2、_snprintf

int _snprintf(

char *buffer,

sizet_t count,

const char* format [,argument]...);

int _snprintf(

char (&buffer)[size],

sizet_t count,

const char* format [,argument]...);//C++ only

3、_snprintf_s

int _snprintf_s(

char *buffer,

size_t sizeOfBuffer,

sizet_t count,

const char* format [,argument]...);

int _snprintf_s(

char (&buffer)[size],

sizet_t count,

const char* format [,argument]...);//C++ only

二、_snprintf_s为何在sizeOfBuffer的基础上多添加一个count

_snprintf_s为何在sizeOfBuffer的基础上多添加一个count?count似乎是用来控制理想的宽度的。如果得到的字符串超过了count,于是会被截断到count的长度后面再加一个null-terminate。当然,更改的优先级还是sizeOfBuffer。如果应该输出的字符串大小达到了sizeOfBuffer,那么就溢出了,溢出情况下,函数把这个当成一个错误,会把buffer缓冲区置为一个空的字符串。而_snprintf_s的好处就是有了count参数,输出的字符串就算超过了count缓冲区得长度,仍然会有输出,输出字符串被截断到count大小,在这个大小的字符串后面加null-terminate当然如果count设置的和sizeOfBuffer一样大或者更大,就失去了作用。如果输出的字符串超过了sizeOfBuffer,缓冲区仍然被置为空字符串。因此希望缓冲区被尽量利用,可以将count参数设置为_TRUNCATE,这样实际效果是count=sizeOfBuffer-1.

三、sprintf_s与_snprintf

在C语言环境下,sprintf_s与_snprintf的对比,_snprintf使用的参数是count,而sprintf_s使用的sizeOfBuffer,这就很能说明问题。如果输出的字符串刚好达到count,那么字符串不能截断,调用_snprintf的时候需要注意返回值,如果返回值不是正数,那么还得注意你的字符缓冲区并不是null-terminate结尾的。总结来说,sprintf_s在缓冲区不够大时会失败,失败时缓冲区中是一个空字符串。_snprintf不会失败,但是如果缓冲区不够大,缓冲区得内容不是null-terminate,必须自己注意字符串的结束,而_snprintf_s结合了两者的优点。

sprintf_s、_snprintf与_snprintf_s相关推荐

  1. sprintf_s与_snprintf与_snprintf_s

    MSDN页面分别如下: spirntf_s: http://msdn.microsoft.com/zh-cn/library/ce3zzk1k%28VS.80%29.aspx _snprintf: h ...

  2. sprintf, snprintf, _snprintf, sprintf_s 等的区别

    先放结论 1.在支持snpritf的编译器 ,只使用int snprintf( char *buffer, size_t count, const char *format [, argument] ...

  3. _snprintf_s与_snprintf

    VS2010测试百度百科给出的例子: char a[16]; size_t i; _snprintf_s 会自动自动截断,保留最大需要拷贝的字符串长度cout(即第二个参数) _snprintf 不会 ...

  4. sprintf、vsprintf、sprintf_s、vsprintf_s、_snprintf、_vsnprintf、snprintf、vsnprintf 函数辨析

    看了题目中的几个函数名是不是有点头晕?为了防止以后总在这样的细节里纠缠不清,今天我们就来好好地辨析一下这几个函数的异同. 实验环境: Windows下使用VS2017 Linux下使用gcc4.9.4 ...

  5. linux下snprintf用法,关于snprintf,_snprintf,_snprintf_s操作

    一.snprintf与snprintf_s的区别 众所周知,sprintf不能检查目标字符串的长度,可能造成众多安全问题,所以都会推荐使用snprintf. snprintf函数在C++11之前 并不 ...

  6. Qt sprintf_s函数格式化字符串出错

    Qt sprintf_s函数格式化字符串出错 问题的出现: 我在VS上用c C++写的跨平台的函数 移植到Qt 上面 出现sprintf_s 函数格式化出错. 开始以为是编码问题  反复查找Qt乱码问 ...

  7. “_snprintf”: 不是“std”的成员

    使用c++ json库时报错: https://github.com/nlohmann/json.git "_snprintf": 不是"std"的成员 原文: ...

  8. sprintf_s的使用

    int sprintf_s(char *restrict buffer, rsize_t bufsz,               const char *restrict format, ...); ...

  9. [C/C++]记录:使用sprintf_s时第二个参数不严格计算导致栈损坏

    (1)使用sprintf_s时第二个参数不严格计算导致栈损坏的情况 这段代码之前便是函数的定义变量的部分. 此处没有严格计算第一个参数指向的字符串的可用长度. 查看局部变量,发现在函数开头初始化为0的 ...

最新文章

  1. iOS9网络适配 info.plist配置
  2. ajax技术怎么应用程序,利用AJAX技术开发应用程序.pdf
  3. 欧姆龙485通讯示例程序_【精品实验】PLC学习神器与温湿度变送器的通讯
  4. 迅雷下gho文件变成php,GHO格式文件转换成WIM格式文件
  5. 批量改变图片尺寸大小的方法!一分钟搞定!
  6. tp5 给图片加水印
  7. QQ农场破解思路(版本20091212)
  8. 使用 html2canvas 生成图片
  9. 怎么样把计算机桌面的图标改小,怎样将电脑桌面图标变小_三招搞定桌面图标太小问题-系统城...
  10. 土方工程量计算表格excel_土石方计算电子表格
  11. HEL库入门教程:STM32CubeIDE汉化教程 直接在线安装 简单易懂
  12. nz-zero Icon图标的基本使用
  13. 微信公众号开发教程[001]-引言
  14. VSCode插件生成编号、目录、文件目录树
  15. epub格式的电纸书
  16. PS磨皮插件DR5白金版修图加强版滤镜后期一键调色mac/win
  17. 导航地图分类隐私政策
  18. JavaWeb毕业生就业招聘管理系统
  19. 洛谷 P2300 合并神犇 解题报告
  20. 前世五百次的回眸,才换来今生的擦肩而过。

热门文章

  1. WebSestalt,好用的富集分析工具,介绍及使用教程
  2. 台式机装苹果系统_iOS系统如何安装外来App?教你一键设置!苹果手机怎么装第三方软件?...
  3. Assembly 调用的目标发生了异常
  4. MacOS编译LibreCAD
  5. 十年Java架构师分享
  6. 《JAVA》编程创建一个Box类(长方体),在Box类中定义三个变量
  7. 基于Android的社交游戏百宝箱App设计与实现
  8. JAVA父类引用指向子类的对象是什么意思?有什么作用?
  9. win10修改user用户名,完美解决,亲试无bugs
  10. 华为机考108题(c++)(101-108)