isdigit
功能檢查是否參數是十進制數字字符。
如果你想工作的方式,只投它:
if (userNumber == correctNumber)
到
if (isdigit(userNumber + (char)'0'))
遵循else
只執行if
括號中的表達式的值爲0
字的聲明。
如果return
值isdigit
功能是true
(而不是0
),您的代碼的下一行將被執行。
在它看起來像這樣的調試器:
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");
如下所示,表達是0
,並且隨後else
總是會被執行如聲明。 printf("That is not a number from 1 - 10");
您最初的代碼如下所示:
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");
如果使用((char) userNumber + '0')
,結果將是相同的。只有獲取該值的指令纔會更改爲movsx eax, byte ptr [ebp-8]
。
請重新閱讀'isdigit'的[documentation](http://www.cplusplus.com/reference/cctype/isdigit/)。你用錯了。 – abelenky
不是說這會解決問題,但'main'通常被聲明爲'int',並且應該返回一些東西(比如0)。代碼塊是否抱怨缺少返回類型? – Nobilis
''#include''rand','isdigit(userNumber -1 +'0')' –
BLUEPIXY