-1

所以......我有一小段代码我已经在早上的大部分时间里工作了。这只是一个帮助我记住语法等的小项目。由于我不明白的原因,代码返回了分段错误,因此我显然错过了某种巨大的错误。

#include <stdio.h>
#include <stdio.h>
#include <unistd.h>
#include <time.h>
#include <getopt.h>

struct cards 
{
int card_value[99];
char card_name[99];
char card_suit[99];
int card_tally;
};

struct cards hand[2];

void tally (int a)
{
int k, j;
for (k=0; k<5; k++)
 {
  j = j + hand[a].card_value[k];
 }
hand[a].card_tally = j;
 }

 void check_for_ace (int a)
 {
int d;
for (d=0; d>5; d++)
  { 
    if (hand[a].card_name[d] =='A')
      {
          int y;
          int z = 10;
          for (y=0; y<5; y++)
            z = z + hand[a].card_value[y];
          if (z < 22)
            hand[a].card_value[d]=10;
          else
            hand[a].card_value[d]=1;
      }

   }
}

void draw_card (int a)
{
int z = 1 + rand () % 13;
int x=0;

while (hand[a].card_value[x] !=  0)
    { x++; }

if ((z > 1) && (z < 10))
  {
      hand[a].card_value[x]=z;
      hand[a].card_name[x]=((char) '0' + z);
  }
else if (z == 10)
  {
      hand[a].card_value[x]=z;
      hand[a].card_name[x]='T';
  }
else if (z == 11)
  {
      hand[a].card_value[x]=10;
      hand[a].card_name[x]='J';
  }   
else if (z == 12)
  {
      hand[a].card_value[x]=10;
      hand[a].card_name[x]='Q';
  }
else if (z == 13)
  {
      hand[a].card_value[x]=10;
      hand[a].card_name[x]='K';
  }
else if (z == 1)
  {
      /*Function 'check_for_ace' deals with this more properly*/
      hand[a].card_value[x]=1;
      hand[a].card_name[x]='A';
  }
 check_for_ace(a);
 tally(a);
}



void display_hands ()
{
int x;
printf("\nDealer's Hand Shows: ");
for (x=0; hand[0].card_name[x]!=0; x++)
  {
      printf("%c ", hand[0].card_name[x]);
  }

printf("\nPlayer's Hand Shows: ");
for (x=0; hand[1].card_name[x]!=0; x++)
  {
      printf("%c ", hand[1].card_name[x]);
  }
}

void dealer_turn()
{
  while (hand[0].card_tally < 17)
  draw_card(0);
}

void player_turn()
{
int op=0;
while (op != 2)
  {
    printf("What would you like to do?\n");
    printf("(1)it or (2)tand\n");
    scanf("%d", &op); 
    if (op == 1)
     draw_card(1);

  }
}   

int main(int argc, char **argv)
{
srand(time(NULL));


    draw_card(0);
    draw_card(1);
    draw_card(1);
    display_hands();
    player_turn();

    dealer_turn();
    display_hands();

return 0;
}

现在,真正奇怪的是,看到 player_turn 和 Dealer_turn 之间的空线了吗?如果我将 display_hands 放在那里,代码将毫无错误地执行。

有任何想法吗?

另外,我意识到我确实使用了不需要的标题。我计划稍后使用它们,并将它们留在这篇文章中,这样我就可以将所有内容与错误保持原样。

4

1 回答 1

5

在执行此行之前,您没有初始化 j 。

  j = j + hand[a].card_value[k];

当我j=0向您的代码添加初始化时,它不再崩溃。

例如

void tally (int a)
{
int k, j;
j=0;  /* <----- added this line */
for (k=0; k<5; k++)
 {
  j = j + hand[a].card_value[k];
 }
hand[a].card_tally = j;
 }
于 2013-03-01T19:48:28.283 回答