snprintf

snprintf

最近使用snprintf 遇到了一个坑 , 下面是snprintf 的函数声明。

int snprintf(char *str, size_t size, const char *format, ...);

我使用的场景如下,当items 结构很多的时候,程序就崩溃了,开始查找了很久,最后发现是snprintf的使用问题。snprintf 我先入为主的认为它的返回值 像 read/ write 系统调用一样,返回的值是成功写入buff的值的大小,但是实际上snprintf的值是你格式化后整个字符串的大小并发实际写入buff的大小。又因为 它的第二个参数是size_t ,那么很可能 返回值被减成 复制,然后又把一个 int 转化成 size_t ,这个时候第二个参数 size 就会很大,从而越界。

struct Item {
int id;
}
char buff[2048] = {0};
void AppendItem(std::vector<Item>& items) {
 int pos = 0;
  for (size_t i = 0; i < items.size(); ++i) {
    pos = snprintf(buff, sizeof(buff) - pos, "%d", items[i].id);
  }
}
总结
  1. snprintf 的第二个参数是size_t ,传参数的时候需要小心。
  2. snprintf 返回值是整个格式化字符串的大小
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值