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型,当然应该还有其它办法....