2010-02-14 3 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

실제로는 8 진수을 입력했기 때문입니다.

C에서 0으로 시작하는 숫자는 8 진수 (8 진수)로 해석됩니다. 따라서, 귀하의 의견에

023919 

scanf는 그래서 8 진수의 가정, 다음 x없이 앞에 0을 찾을 수 있습니다. 그런 다음 9까지 유효 한 8 진수가 아니고 중지 될 때까지 23을 소비합니다. 그래서 scanf 지금이

2*8 + 3 = 19 

입니다

023 

그래서 절차는이를 방지하기 위해 19


사용 형식 %d 대신 %i를 반환합니다.

+0

질문을 검색하여 더 많은 답변을 제공하고 지식을 얻는 데 도움이됩니다. 따라서 입력 문자열이 올바르지 않으면 scanf가 오류를 발생시켜야하므로 * 잊어 버린 * 기능입니다. – Behrooz

+0

아니요, 그것은 수십 년 동안의 방식대로 작동하는 scanf이고 작동하는 것으로 문서화 된 방식입니다. –

1

scanf을 직접 (인라인 어셈블리없이) 사용한 경우와 동일합니다. "023"은 19 진수 표현이며, scanf는 "0239"의 "9"에서 멈 춥니 다. 왜냐하면 8 진수가 될 수 없기 때문입니다.

관련 문제