编辑:非常感谢您的详细回复 尝试用C语言编程。我包含了'ctype.h'和'stdio.h'库。我得到程序提示用户输入带有'printf'的数字,但是当我尝试用'scanf'存储它时,它似乎在程序中的那一点崩溃。有什么特别的我应该检查,因为我真的只是下载并安装了代码块,假设它可以工作。请帮忙。
这是我的代码:
#include <stdio.h>
#include <ctype.h>
main()
{
int userNumber = 0;
int correctNumber = 0;
correctNumber = (rand() % 10) + 1;
printf("Pick a number between 1 and 10");
scanf("%d", &userNumber);
if (isdigit(userNumber)) {
if (userNumber == correctNumber) {
printf("Yay, you guessed it!");
}
else {
printf("Wrong Number!!!");
}
}
else {
printf("That is not a number from 1 - 10");
}
}
答案 0 :(得分:2)
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]
。
答案 1 :(得分:0)
进行以下更改
if (isdigit((char)userNumber+'0'))
程序在gcc中运行得非常好,使用stdlib.h作为rand函数
答案 2 :(得分:0)
而不是:if(isdigit(userNumber))
写下这个:if((userNumber>0)&&(userNumber<=10))
答案 3 :(得分:0)
#include <stdio.h>
#include <ctype.h>
main()
{
char userNumber = 0; // isdigit can only be used on char
int correctNumber = 0;
correctNumber = (rand() % 10) + 1;
printf("Pick a number between 1 and 10");
scanf("%c", &userNumber);
if (isdigit(userNumber)) {
if ((userNumber-'0') == correctNumber) { // Convert userNumber to int
printf("Yay, you guessed it!");
}
else {
printf("Wrong Number!!!");
}
}
else {
printf("That is not a number from 1 - 10");
}
}
另外,isdigit()只能用于检测0-9中的char。在您的代码中,10将无法正确识别。
答案 4 :(得分:0)
我为输入不符合预期的不同情况添加了一些退出代码,并进行了一些进一步验证(除了修复main
的返回类型)。我还对correctNumber
值进行了硬编码以便于测试。
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
int main() /* let's fix the signature for main */
{
char userNumber [10]; /* as we need to pass a char array let's change the type for userNumber */
int correctNumber = 0;
correctNumber = 5;/*(rand() % 10) + 1; - I've hardcoded this just for the sake of testing */
printf("Pick a number between 1 and 10: ");
scanf("%s", userNumber);
/* I've updated the if a bit to check separately for range and whether input is a valid number */
if (isdigit(userNumber[0]))
{
int inputtedNumber = atoi(userNumber); /* convert string to int */
if (inputtedNumber <= 10 && inputtedNumber > 0) {
if (inputtedNumber == correctNumber) {
printf("Yay, you guessed it!\n");
exit(0); /* exit is used to indicate the execution status to the environment (successful or if not how it failed */
` }
else {
printf("Wrong Number!!!\n");
exit(1);
}
}
else {
printf("You've not inputted a number between 1 and 10.\n");
exit(2);
}
}
else {
printf("You've not inputted a valid number.\n");
exit(3);
}
}
如果有什么不清楚,请告诉我。
答案 5 :(得分:-1)
函数"int isdigit(int c);"
是“检查c是否为十进制数字符。”
所以改变你这样的代码:
scanf("%d",&userNumber)
==&GT;
scanf("%c",&userNumber);
它将按预期工作!
添加:
if(uerNumber == currentNumber)
==&GT;
if((userNUmber - '0') ==currentNumber)
你能否回复我的声誉?我在凌晨3点回答你的问题,只是有点困了