为什么这会崩溃? - C

时间:2013-04-05 22:58:27

标签: c

我如此接近完成这一点,至少我希望如此,因为如果我不是我会疯了。我已经设法摆脱所有的语法和错误摆脱编译器,我启动它希望我最终完成然后......它崩溃......

为了对它的工作方式进行一些概述,假设从“套牌”中打印出五个值 - 然后再次随机将其重新打印(以显示它的混洗)

我太近了。我可以品尝它!

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define SIZE 52

enum faces{Ace = 0, Jack = 10, Queen, King};
char * facecheck(int d); 
void shuffle( int deck[]);
void draw(int deck[SIZE]); 
void cards(int hand);
int main() 
{ 
    int deck[SIZE], i, n;
    char suits[4][9] = 
    {
        "Hearts",
        "Diamonds",
        "Clubs",
        "Spades"};


    srand( time( NULL ) ) ;

    for(i = 0; i<SIZE; i++)
    {
        deck[i] = i;
        i++;
    };

    draw(deck);
    shuffle(deck); 
    draw(deck);




    return 0; 
}  

char * facecheck(int d)
{
    static char * face[] = 
    {
        "Ace",
        "Jack",
        "Queen",
        "King" };

    if(d == Ace)
        return face[0];
    else
    {
        if(d == Jack) 
            return face[1];
        else
        {
            if(d == Queen)
                return face[2];
            else 
            { 
                if(d == King)
                    return face[3];
            }
        }
    }
}



void shuffle( int deck[]) 
{
     int i, j, temp; 

     for(i = 0; i < SIZE; i++)
     {
           j = rand() % SIZE; 
           temp = deck[i];
           deck[i] = deck[j];
           deck[j] = temp;
           }
     printf("The deck has been shuffled \n"); 
} 

void draw(int deck[SIZE])
{
     int i; 
     int hand[i];

     for(i = 0; i < 5; i++)
     {
           cards(hand[i]);
           putchar('\n');
           }
}

void cards(hand)
{
     int i; 

         char suits[4][9] = 
    {
        "Hearts",
        "Diamonds",
        "Clubs",
        "Spades"};

         for(i=0; i<SIZE; i++)
    {       
        if(i%13 == 0 || i%13 == 10 || i%13 == 11 || i%13 == 12)
            printf("%s ", facecheck(i%13) );
        else printf("%d ", i%13+1);
        printf("of %s \n", suits[i/13]);
    }

}

3 个答案:

答案 0 :(得分:2)

它可能会崩溃,因为这里:

for(i = 0; i<SIZE; i++)
{
    deck[i] = i;
    i++;
};
你增加了两次。 删除i++行:

for(i = 0; i<SIZE; i++)
{
    deck[i] = i;
};

另外,这里:

void draw(int deck[SIZE])
{
     int i; 
     int hand[i];

int hand[i]可能会失败,因为我不是常量(它也没有初始化)。

答案 1 :(得分:0)

一些注意事项:

void draw(int deck[SIZE])
{
    int i; 
    int hand[i];

    for(i = 0; i < 5; i++)
    {
        cards(hand[i]);
        putchar('\n');
    }
}

i默认情况下没有初始化,并且包含之前该内存地址中的内容,然后你创建一个这个随机长度的数组 - 你的意思是这样做吗?

然后你将手[0],手[1],......,手[4]传递给牌,即使它们未定义。

这可能会导致崩溃。

也许你想要这样的东西:

void draw(int deck[SIZE])
{
    int numCards = 5;
    int i; 
    int hand[numCards];
    int card;
    for(i = 0; i < numCards; i++)
    {
        card = deck[i];     /* Draw a card */
        hand[i] = card;     /* Store it in a "hand" array (even though you dont use it) */
        cards(card);        /* Display info about the card */
    }
}

在这里打印出每张卡的整数值,无论你的牌组如何分类。

void cards(hand)
{
    int i; 

    char suits[4][9] = 
    {
        "Hearts",
        "Diamonds",
        "Clubs",
        "Spades"};

    for(i=0; i<SIZE; i++)
    {       
        if(i%13 == 0 || i%13 == 10 || i%13 == 11 || i%13 == 12)
            printf("%s ", facecheck(i%13) );
        else 
            printf("%d ", i%13+1);
        printf("of %s \n", suits[i/13]);
    }

}

我认为你不是故意这样做的。我认为你的意思是

void cards(int card)
{
    char suits[4][9] = 
    {
        "Hearts",
        "Diamonds",
        "Clubs",
        "Spades"};


    if(card%13 == 0 || card%13 == 10 || card%13 == 11 || card%13 == 12)
        printf("%s ", facecheck(card%13) );
    else 
        printf("%d ", card%13+1);
    printf("of %s \n", suits[card/13]);
}

由于您已经在每张卡上调用此功能,因此没有理由循环使用任何内容。

答案 2 :(得分:0)

for(i = 0; i<SIZE; i++)
{
    deck[i] = i;
    i++;
};

for-loop中分号的错误?

for(i = 0; i<SIZE; i++)
{
    deck[i] = i;
    i++; //one of the answer stated to remove this sentence
}