浅谈sscanf陷阱

简介: sscanf虽然是个不错的函数,它可以很简单的将字符串转成特定的格式,比如转成整数、浮点数等等。但是如果使用不慎,会带来很大的麻烦。

sscanf虽然是个不错的函数,它可以很简单的将字符串转成特定的格式,比如转成整数、浮点数等等。但是如果使用不慎,会带来很大的麻烦。


今天笔者在使用sscanf时,就遇到了一个诡异的问题。


代码的书写如下:


//begin added by liuzhiyong 20160504
int HexToBin(char *src,char *bin,int length)
{
  int i = 0;
  int j = 0;
  printf("HexToBin src = %s length = %d\n",src,length);
  unsigned char temp;
  char buf[3]={0};
  for (i = 0;i < length; i+=2)
  {
   strncpy(buf,src+i,2);  
   buf[2] = 0;
   sscanf(buf,"%x",&temp);
   bin[j] = temp;
   j++;
  printf("i = %d j = %d buf = %s temp = %d\n",i,j,buf,temp);
  }
  return 1;
}
//end 20160504


貌似没问题,但在实际调用的时候,陷入了死循环,经打印i的值始终为0.


通过分析,"%x"这个格式转化出来的值的类型是int,而且它会把后面的变量当成int来处理,而int的值在内存中为4个字节。而temp只是一个字节,sscanf将i的值也顺带赋值了,赋值为0.




了解到问题的根源后,将代码修改为:


//begin added by liuzhiyong 20160504
int HexToBin(char *src,char *bin,int length)
{
  int i = 0;
  int j = 0;
  printf("HexToBin src = %s length = %d\n",src,length);
  int temp;
  char buf[3]={0};
  for (i = 0;i < length; i+=2)
  {
   strncpy(buf,src+i,2);  
   buf[2] = 0;
   sscanf(buf,"%x",&temp);
   bin[j] = (unsigned char)temp;
   j++;
  printf("i = %d j = %d buf = %s temp = %d\n",i,j,buf,temp);
  }
  return 1;
}
//end 20160504


问题得以解决。

相关文章
|
传感器 数据采集 物联网
MQTT 的 QoS 等级:QoS 0、QoS 1、QoS 2
MQTT 的 QoS 等级:QoS 0、QoS 1、QoS 2
4822 0
|
4月前
|
Java Spring
Spring Boot配置的优先级?
在Spring Boot项目中,配置可通过配置文件和外部配置实现。支持的配置文件包括application.properties、application.yml和application.yaml,优先级依次降低。外部配置常用方式有Java系统属性(如-Dserver.port=9001)和命令行参数(如--server.port=10010),其中命令行参数优先级高于系统属性。整体优先级顺序为:命令行参数 &gt; Java系统属性 &gt; application.properties &gt; application.yml &gt; application.yaml。
960 0
|
数据可视化 开发者 索引
详解Wireshark LUA插件函数:function p_myproto.dissector(buffer, pinfo, tree)
在 Wireshark 中,LUA 插件通过 `function p_myproto.dissector(buffer, pinfo, tree)` 扩展协议解析能力,解析自定义应用层协议。参数 `buffer` 是 `PacketBuffer` 类型,表示原始数据包内容;`pinfo` 是 `ProtoInfo` 类型,包含数据包元信息(如 IP 地址、协议类型等);`tree` 是
586 1
|
C语言
【C语言】:浅谈函数 fscanf/sscanf 和 fprintf/sprintf
【C语言】:浅谈函数 fscanf/sscanf 和 fprintf/sprintf
381 1
|
消息中间件 Java Spring
Spring Boot与RabbitMQ的集成应用
Spring Boot与RabbitMQ的集成应用
STM32CubeMX IWDG和WWDG
STM32CubeMX IWDG和WWDG
566 11
|
XML JSON 程序员
总结一下 .NET FrameWork 和 .NET Core 创建的项目的不同点
总结一下 .NET FrameWork 和 .NET Core 创建的项目的不同点
374 0
|
存储 安全 Linux
网络请求的高效处理:C++ libmicrohttpd库详解
网络请求的高效处理:C++ libmicrohttpd库详解
|
存储 并行计算 程序员
pthread_create函数详解
pthread_create函数详解