char* ReadNumericFormat = "%i";
int Read(void)
{
int Storage;
__asm
{
LEA EAX, [Storage]
PUSH EAX
PUSH DWORD PTR [ReadNumericFormat]
CALL DWORD PTR [scanf]
ADD ESP, 8
MOV EAX, DWORD PTR [Storage]
}
}
当用户输入“023919”时,程序返回19.
这是一个功能还是黑暗是一个标准?
答案 0 :(得分:8)
实际上那是因为您输入了八进制数。
在C中,以0开头的数字将被解释为八进制(base-8)文字。因此,在您的输入
023919
scanf
找到一个前导零而没有x
跟随,所以假设它是一个八进制数。然后它消耗2
和3
,直到9
,这不是有效的八进制数字并停止。所以scanf
现在有
023
是
2*8 + 3 = 19
所以程序返回19。
使用格式%d
代替%i
来阻止此操作。
答案 1 :(得分:1)
如果您直接使用scanf
(没有内联汇编),则相同。 “023”是19的八进制表示,scanf在“0239”中的“9”处停止,因为它不能是八进制数字。