isdigit
function checks whether parameters is a decimal digit character .
If you want to work that way, just cast it :
if (userNumber == correctNumber)
to
if (isdigit(userNumber + (char)'0'))
The statement that follows the word else
is executed only if
the expression in parentheses has the value 0
.
If return
value of isdigit
function is true
(not be 0
), next line of your code will be executed .
Under the debugger it looks like this :
CPU Disasm
Address Hex dump Command Comments
00401048 |. 68 24504200 push offset t3.00425024 ; /format = "%d"
0040104D |. E8 E3070000 call t3.scanf ; \scanf - Read your integer variable and store it to int
00401052 |. 83C4 08 add esp,8 ;
00401055 |. 8B45 F8 mov eax,dword ptr [ebp-8] ; Store userNumber in eax (5 in this case)
00401058 |. 83C0 30 add eax,30 ; 5 + 0x30 = 0x35 = Character 0, so decimal number is converted to char value 5
0040105B |. 50 push eax ; /c => 48., stack it
0040105C |. E8 E6020000 call t3.isdigit ; execute isdigit function - if (isdigit(userNumber+(char)'0'))
00401061 |. 83C4 04 add esp,4 ; adjust stack
00401064 |. 85C0 test eax,eax ; isdigit returned result is 0 ?
00401066 |. 74 37 jz short t3.0040109F ; if result is NOT 0, next line will be executed
00401068 |. 8B4D F8 mov ecx,dword ptr [ebp-8] ; ecx = userNumber
0040106B |. 3B4D FC cmp ecx,dword ptr [ebp-4] ; if (userNumber == correctNumber)
0040106E |. 75 0F jne short t3.0040107F ; if condition is TRUE - statement1 will be executed, otherwise statement2
00401084 |. E8 22080000 call t3.printf ; printf("Yay, you guessed it!");
....
00401081 |. E8 25080000 call t3.printf ; printf("Wrong Number!!!");
.....
0040109F |. E8 05080000 call t3.printf ; printf("That is not a number from 1 - 10");
As seen below, expression is 0
, and statement that follows else
always will be executed eg.printf("That is not a number from 1 - 10");
Your initial code looks like this :
Address Hex dump Command Comments
0040104D |. E8 E3070000 call t3.scanf ; \scanf
00401052 |. 83C4 08 add esp,8 ;
00401055 |. 8B45 F8 mov eax,dword ptr [ebp-8] ; eax is now 5, but this time the conversion is not made
00401058 |. 50 push eax ; /c => 5
00401059 |. E8 E9020000 call t3.isdigit ; \isdigit
.....
00401061 |. 85C0 test eax,eax ; isdigit returned 0 this time
00401063 |. 74 37 jz short t3.0040109C ; well, jump to last printf
.....
0040109C |. E8 05080000 call t3.printf ; \printf("That is not a number from 1 - 10");
If use ((char) userNumber + '0')
, result will be the same. Only instruction which gets the value will be changed to movsx eax, byte ptr [ebp-8]
.