浅谈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


问题得以解决。

相关文章
|
21天前
|
存储 C语言
【我爱C语言】详解字符函数isdigit和字符串转换函数(atoi和snprintf实现互相转换字符串)&&三种strlen模拟实现2
【我爱C语言】详解字符函数isdigit和字符串转换函数(atoi和snprintf实现互相转换字符串)&&三种strlen模拟实现
|
6月前
|
C语言
你应该知道的C语言干货(2)(strlen和strcpy的模拟实现)
你应该知道的C语言干货(2)(strlen和strcpy的模拟实现)
30 0
|
6月前
|
C语言
【c语言】atoi的模拟实现
【c语言】atoi的模拟实现
35 0
|
17天前
|
安全 C语言 C++
【C语言】超详解strncpy&&strncat&&strncmp&&strerror&&perror的使⽤和模拟实现
【C语言】超详解strncpy&&strncat&&strncmp&&strerror&&perror的使⽤和模拟实现
|
17天前
|
C语言
【C语言】字符串函数strcpy&&strcat&&strcmp&&strstr的使⽤和模拟实现2
【C语言】字符串函数strcpy&&strcat&&strcmp&&strstr的使⽤和模拟实现
|
20天前
|
存储 C语言
【C语言】字符串函数strcpy&&strcat&&strcmp&&strstr的使⽤和模拟实现1
【C语言】字符串函数strcpy&&strcat&&strcmp&&strstr的使⽤和模拟实现
|
7月前
|
API C语言
利用strstr与atoi的结合实现一个C语言获取文件中数据的工具
利用strstr与atoi的结合实现一个C语言获取文件中数据的工具
37 0
|
8月前
|
数据安全/隐私保护 C语言
【C语言】getchar和putchar函数详解:字符输入输出的利器
【C语言】getchar和putchar函数详解:字符输入输出的利器
256 0
|
8月前
|
编译器 C语言
【C语言进阶】字符函数及字符串函数,带你掌握核心用法并模拟实现(1)——strlen,strcpy,strcmp
【C语言进阶】字符函数及字符串函数,带你掌握核心用法并模拟实现(1)——strlen,strcpy,strcmp
92 1