Code :: Blocks崩溃/真的很困惑

时间:2013-07-20 15:34:21

标签: c codeblocks

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

   }
}

6 个答案:

答案 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");

如下所示,表达式0else后面的语句将始终执行,例如。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点回答你的问题,只是有点困了