ubuntu中使用snprintf的误区

近期在开发android驱动时遇到一个有趣的现象:
1. 在android kernel中使用snprintf组包
char buf[256] = "abcd";
char test = 0xE1;  
snprintf(buf, sizeof(buf), "%s%02X", buf, test);
printk("buf = %s\n", buf);
结果:abcdE1
2. 同样在ubuntu中组包
结果:FFFFFFE1

这其实是两个问题下面做简要分析:
下面使用sprintf做简要分析,snprintf是一样的
1. sprintf 的原型为:
int sprintf(char *restrict s, const char *restrict format, ...);
其中 char* restrict s 的含义为通过s 指向的内存空间不得与其他指针参数指向的内存的空间重叠。比如如下的语句就是错误的用法, 因为参数1与参数3指向的内存重叠了。
但在android kernel中sprintf这种做法作为增强版的strcat,所以出现了android与ubuntu不一致现象。
sprintf(buf, "%s foo %d %d", buf, var1, var2);
在 ubuntu 8.10 所带的 gcc 中,如果编译时加入了优化选项(比如 -O1, -O2), 那么sprinf 会首先将 s 清空,比如如下的程序会输出 "fail", 而不是 "not fail"。
#include <stdio.h>
char buf[80] = "not ";
int main() {
  sprintf(buf, "%sfail", buf);
  puts(buf);
  return 0;
}
作为补救方案,可以使用如下的语句来代替:
sprintf(buf+strlen(buf), " foo %d %d", var1, var2);
2、而对于在ubuntu打印中出现FFFFFF的问题其实是因为E1超出了char类型的限制,为android kernel char类型可以正常打印128以上的char类型数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

产品人卫朋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值