首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

sscanf() 得到不正确得结果,该怎么解决

2012-02-04 
sscanf() 得到不正确得结果 #includeiostream#includewindows.h//病毒特征结构typedefstructtagVSIGNA

sscanf() 得到不正确得结果

#include   <iostream>
#include   <windows.h>


//   病毒特征结构
typedef   struct   tagVSIGNATURE  
{  
unsigned   shortwIdx;//   病毒编号
unsigned   shortwLen;//   要取的特征码的长度
unsigned   longdwOffset;//   内存地址
}VSIGNATURE,*PVSIGNATURE;

VSIGNATURE   vSign;

void   main(int   argc,   char   argv[])
{
char       string[]       =       "1   00401000   16 ";    

sscanf(string, "%d   %x   %d ",   &vSign.wIdx,   &vSign.dwOffset,   &vSign.wLen);
printf( "%d   %x   %d\nn ",   vSign.wIdx,   vSign.dwOffset,   vSign.wLen);

}

==================================
运行结果:
1   400000   16
nPress   any   key   to   continue

==================================
问题:
正确的结果应该是:   1   401000   16  
而不是                           1   400000   16
这是什么原因?

[解决办法]
sscanf 取它(&vSign.wLen)的时候 越界了,你可以把后面的16改成 65536看看效果,
实际上dwOffset的低两字节是wLen当成整数来看的高两字节。
[解决办法]
typedef struct tagVSIGNATURE
{
unsigned intwIdx;// 病毒编号
unsigned intwLen;// 要取的特征码的长度
unsigned longdwOffset;// 内存地址
}VSIGNATURE,*PVSIGNATURE;
[解决办法]
sscanf(string, "%hd %x %hd ", &vSign.wIdx, &vSign.dwOffset, &vSign.wLen);
[解决办法]
typedef struct tagVSIGNATURE
{
unsigned shortwIdx;// 病毒编号
unsigned shortwLen;// 要取的特征码的长度
unsigned longdwOffset;// 内存地址
}VSIGNATURE,*PVSIGNATURE;
决定了vSign.wLen的地址和vSign.dwOffset的地址低2个字节
sscanf( "1 00401000 16 ", "%d %x %d ", &vSign.wIdx, &vSign.dwOffset, &vSign.wLen);
栈里vSign.dwOffset的值从高到低本来应该是
00
40
10
00

vSign.wLen的值从高到低本来应该是(16的十六进制是10)
10
00

因为%d的缘帮,sscanf要往vSign.wLen的地址里写4个字节 00 00 10 00
所以00 00就写到vSign.dwOffset的低两个字节去了。

所以解决办法是用%hd 比如楼上shw014()的方法或者更改结构的定义,比如都为4个字节的long型,当然应该还有其它办法....

热点排行