2013-04-05 142 views
-2

我很接近完成这一点,至少我希望如此,因为如果我不是,我会去疯了。我已经设法摆脱了所有的语法和错误,摆脱编译器,我开始希望我会终于完成,然后...它崩溃...这是为什么会崩溃? - 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]); 
    } 

} 
+0

请问您可以发布错误信息吗? – jsedano 2013-04-05 23:01:01

+0

我不想这么说,因为你显然已经做出了努力,但通常我们会要求你提供一小段代码,你知道这是导致问题的原因。你的操作系统是什么?因为我们至少可以建议一些调试器,它们可以让你看到崩溃的确切位置。 – zneak 2013-04-05 23:01:23

+0

@ Anakata,没有错误信息,它编译器就好了。但是当我尝试在编译器中加载它时,它只是失败 @zneak我使用64位Windows 7,我也不知道问题是什么,否则我会这么做。 – 2013-04-05 23:05:09

回答

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]可能会失败,因为我不是一个常数(它不是也初始化)。

+3

这样的问题就像是视觉测试...... – Archie 2013-04-05 23:04:06

+0

w/r/t'int hand [i]',那时'i = 0'和'int hand [0]'在某些编译器上是可以接受的(例如[ ** GNU C **](http://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html))。所以,它可能不会失败或崩溃,可能会根据您的编译标志发出警告。这几乎肯定是无意的。 – jedwards 2013-04-05 23:28:00

+0

@jedwards,gcc将允许可变长度的数组,所以它是没有意义的。 – zneak 2013-04-06 01:42:08

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]); 
} 

既然你已经调用每个卡,没有理由遍历任何关于此功能。

+0

“我默认初始化为0” - 不,它不是。 – 2013-04-05 23:50:27

+0

@JimBalter,谢谢 - 太多的Java。 – jedwards 2013-04-05 23:54:26

+0

我在想C#,但我觉得它是两个之一。 :-) – 2013-04-05 23:56:52

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

for循环中分号的错误?

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