1

编辑:非常感谢您 尝试用 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");

   }
}
4

6 回答 6

2

isdigit函数检查参数是否为十进制数字字符
如果您想以这种方式工作,只需将其转换为:

if (userNumber == correctNumber)

if (isdigit(userNumber + (char)'0'))

单词后面的语句else仅执行if括号中的表达式具有值0
如果函数return的值isdigittrue(不是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");

如下所示,表达式is0和后面的语句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]

于 2013-07-20T18:28:46.507 回答
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);
    }
}

如果有不清楚的地方,请告诉我。

于 2013-07-21T02:32:14.947 回答
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 的字符。在您的代码中 10 将无法正确识别。

于 2013-07-20T19:07:57.057 回答
0

进行以下更改

 if (isdigit((char)userNumber+'0'))

该程序在 gcc 中运行良好,将 stdlib.h 用于 rand 函数

于 2013-07-20T18:03:01.920 回答
0

代替: if(isdigit(userNumber))

写这个: if((userNumber>0)&&(userNumber<=10))

于 2013-07-20T18:46:47.677 回答
-1

功能"int isdigit(int c);"是“检查 c 是否为十进制数字字符。

所以改变你的代码是这样的:

scanf("%d",&userNumber)

==>

scanf("%c",&userNumber);

它将按预期工作!

添加这个:

if(uerNumber == currentNumber)

==>

if((userNUmber - '0') ==currentNumber)

你能把我的名声还给我吗?我在凌晨 3 点回答你的问题,只是有点困

于 2013-07-20T18:29:40.350 回答