C++ 为什么扫描结果与用户输入不同?
当用户输入“023919”时,程序返回19。C++ 为什么扫描结果与用户输入不同?,c++,inline-assembly,C++,Inline Assembly,当用户输入“023919”时,程序返回19。 这是一个特征还是黑暗是一个标准 实际上那是因为你输入了一个八进制数 在C语言中,以0开头的数字将被解释为八进制(基-8)文字。因此,在您的输入中 char* ReadNumericFormat = "%i"; int Read(void) { int Storage; __asm { LEA EAX, [Storage] PUSH EAX PUSH DWORD PT
这是一个特征还是黑暗是一个标准 实际上那是因为你输入了一个八进制数 在C语言中,以0开头的数字将被解释为八进制(基-8)文字。因此,在您的输入中
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]
}
}
scanf
找到一个前导零,后面没有x
,因此假设它是一个八进制数。然后它消耗2
和3
,直到9
这不是有效的八进制数字并停止。因此,scanf现在已经
023919
那是
023
所以程序返回19
使用格式
%d
而不是%i
来防止这种情况。如果直接使用scanf
(无内联汇编),则情况相同。“023”是19的八进制表示,scanf在“0239”中的“9”处停止,因为它不能是八进制数字。您正在使用内联汇编程序替换一行C代码?这是一个学习内联汇编程序的练习,或者您确实需要学习一些关于优化的知识。:-)@Paul Tomblin:我正在尝试减少代码字节。这是一个有趣的代码…它有损于使用高级语言的全部目的…@ TMMIEB75:我使用C++的唯一原因是“它总是比MASM更容易”。(例如调用C标准库函数),尝试编写等效的C函数并只发布“内联程序集”会更有意义问题C和内联程序集是否不能产生相同的结果。因此,这是一个被遗忘的功能。因为当输入字符串不正确时,scanf应该会引发错误。不,这是scanf几十年来的表现,以及它的工作方式。
2*8 + 3 = 19