前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基础知识 | 每日一练(115)

基础知识 | 每日一练(115)

作者头像
小林C语言
发布2019-09-17 17:00:27
3710
发布2019-09-17 17:00:27
举报
基础知识练习

学生:我怎样才知道对于任意的 sprintf 调用需要多大的目标缓冲区?怎样才能避免 sprintf() 目标缓冲区溢出?

小林:当用于 sprintf() 的格式串已知且相对简单时, 你有时可以预测出缓冲区的大小。如果格式串中包含一个或两个 %s, 你可以数出固定字符的个数再加上对插入的字符串的 strlen() 调用的返回值。

当格式串更复杂或者在运行前未知的时候, 预测缓冲区大小会变得跟重新实现 sprintf 一样困难, 而且会很容易出错。有一种最后防线的技术, 就是 fprintf() 向一块内存区或临时文件输出同样的内容, 然后检查 fprintf 的返回值或临时文件的大小,并提防写文件错误。

如果不能确保缓冲区足够大, 你就不能调用 sprintf(), 以防缓冲区溢出后改写

其它的内存区。如果格式串已知, 你可以用 %.Ns 控制 %s 扩展的长度, 或者使用%.*s。

要避免溢出问题, 你可以使用限制长度的 sprintf() 版本, 即 snprintf()。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-09-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 C语言入门到精通 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档