2010-02-14 94 views
0
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.
這是一個特徵還是黑暗是標準?爲什麼scanf結果與用戶輸入不同?

+1

您使用內聯彙編程序來替換一行C代碼?要麼這是學習內聯彙編程序的練習,要麼你真的需要學習一些關於優化的知識。 :-) –

+1

@ Paul Tomblin:我試圖減少代碼字節。 – Behrooz

+1

在這種情況下,它的選項2. –

回答

8

其實這是因爲您輸入了八進制數

在C中,以0開頭的數字將被解釋爲八進制(基8)文字。因此,在你輸入

023919 

scanf發現沒有x以下前導零,因此假定它是一個八進制數。然後它消耗23,直到9這不是有效的八進制數字並停止。所以scanf現在有

023 

這是

2*8 + 3 = 19 

所以過程返回19


使用格式%d而不是%i,以防止這一點。

+0

,因此它是*遺忘*功能。因爲scanf應該在輸入字符串不正確時引發錯誤。 – Behrooz

+0

不,它是數十年來的scanf行爲方式,也是它記錄下來的工作方式。 –

1

如果您直接使用scanf(沒有內聯彙編),這也是一樣的。 「023」是19的八進制表示,並且scanf在「0239」中的「9」處停止,因爲它不能是八進制數字。

相關問題