C/C++ snprintf 函数详解
C/Csnprintf函数详解snprintf在 C99 中标准化在固定大小的字符数组中做带长度上限的格式化写入避免sprintf因不检查边界导致的缓冲区溢出。下文说明其原型、返回值语义、与相关 API 的差异及常见用法。目录函数原型与参数返回值与截断判定相对sprintf等接口的特点常见用法示例使用注意与sprintf、strncpy等的对比参考链接函数原型与参数#includestdio.hintsnprintf(char*str,size_tsize,constchar*format,...);参数含义str目标缓冲区首地址size缓冲区总容量字节数函数最多写入size个字节其中包含为终止符\0预留的空间format格式串与printf系列一致...与格式说明符对应的实参当size 0时写入内容始终以\0结尾若发生截断则缓冲区为合法 C 字符串前缀。size 0时标准允许不写入str仅通过返回值报告「本应有的输出长度」。返回值与截断判定在符合 C 标准的实现中snprintf的返回值为若输出不受size限制时应写入的字符个数不含末尾\0。据此可作如下判断设n snprintf(...)n 0发生编码错误等实现相关见编译器文档。size 0且(size_t)n size未截断完整结果已写入缓冲区。n size且size 0输出被截断完整输出至少需要n 1字节空间才能容纳\0语义上等价于「需要n个非空字符再加终止符」。部分代码用n (int)size检测截断时应注意size与int的范围及符号。若需两次调用先算长度再分配可先snprintf(NULL, 0, format, ...)C99 起允许得到所需长度再分配缓冲区并第二次调用具体是否支持str NULL需以所用标准库为准。相对sprintf等接口的特点边界由size约束最大写入量降低越界风险。可移植性C99 起为标准接口主流桌面/嵌入式工具链均提供。极老环境或历史上非完全兼容的实现需查阅厂商说明。表达能力与printf相同的格式说明用于整数、浮点、字符串、指针及宽度/精度等。常见用法示例基本格式化charbuffer[100];intnsnprintf(buffer,sizeof(buffer),Hello, %s!,world);/* buffer 为以 \0 结尾的 Hello, world!n 为应输出字符数 */截断与返回值charbuffer[10];intnsnprintf(buffer,sizeof(buffer),This is a long message);/* buffer 内为截断后的前缀并以 \0 结尾若未截断需 n1 字节则 n (int)sizeof(buffer) */拼接路径或片段charpath[256];snprintf(path,sizeof(path),%s/%s,/usr/local/bin,my_app);将「仅拷贝字符串」写成snprintf(buf, sizeof(buf), %s, src)可统一走格式化路径并保证在size 0时以\0结尾仍须检查截断。使用注意size应传入缓冲区总长度如sizeof(buf)而不是「希望写入的字符数」。最多向str写入size个字节其中包含终止符位置。返回值对可能超长或来自外部的数据应据返回值判断截断或错误再决定扩容、报错或丢弃。线程安全snprintf只写调用方提供的缓冲区不修改format与可变参数以外的共享状态在不同缓冲区上并发调用是常见用法。同一缓冲区上的并发写仍需由调用方同步。format与可变参数若格式串或类型不匹配行为未定义用户可控格式串时存在格式化字符串风险需校验或固定格式。与sprintf、strncpy等的对比项目snprintfsprintfstrncpy边界限制有size无有计数格式化支持支持不支持仅拷贝\0终止size0时保证保证写入仅当源串短于n等情况下才自然终止常需手动处理末尾典型风险忽略截断导致逻辑错误缓冲区溢出不补\0、填充NUL行为易误用需要格式化输出时应使用带长度限制的接口snprintf或平台提供的snprintf_s等扩展以项目规范为准避免使用无长度检查的sprintf。仅需安全复制时现代代码常优先snprintf(dst, sizeof(dst), %s, src)并检查返回值或strlcpy/strcpy_s等依平台与规范而不是依赖strncpy的语义。参考链接相关公开文章背景阅读https://mp.weixin.qq.com/s/yq0997KNi30colvyGTxs4g具体语义以当前编译器所实现的 C/C 标准库及语言标准版本为准C 中在cstdio暴露std::snprintfC11 起。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2447989.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!