C++ 为什么扫描结果与用户输入不同?

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

当用户输入“023919”时,程序返回19。

这是一个特征还是黑暗是一个标准

实际上那是因为你输入了一个八进制数

在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