函数中的printf重复打印,然后停止并正常工作

时间:2015-04-26 16:02:42

标签: c pointers

我正在研究C中的二十一点程序,只是因为,而且我被困在了奇怪的bug上。

这是代码(抱歉所有注释行,我正试图追踪这个错误):

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <stdbool.h>

    #define NUM_SUITS 4
    #define NUM_RANKS 13

    void deal(int *pnum_cards, int *prank) {  

      static bool in_hand[NUM_SUITS][NUM_RANKS] = {false}; 
      const char rank_code[] = {'A','2','3','4','5','6','7','8','9','T','J','Q','K',};        

    int suit = 0, rank = 0;

    srand((unsigned) time(NULL)); 
    suit = rand() % NUM_SUITS;
        rank = rand() % NUM_RANKS; 


    if (!in_hand[suit][rank]) {
        in_hand[suit][rank] = true;
        *pnum_cards = *pnum_cards - 1;
    printf("Pnum_cards In deal %d\n", *pnum_cards);
        if (suit == 0){
            printf("%c of Clubs \n", rank_code[rank]);
            }
        else if (suit == 1){
            printf("%c of Diamonds \n", rank_code[rank]);
        }
        else if (suit == 2){
            printf("%c of Hearts \n", rank_code[rank]);
        }
        else if (suit == 3){
            printf("%c of Spades \n", rank_code[rank]);
        }
    }
//  return rank;
//  printf("Rank In deal %d\n", rank);
    *prank = rank+1;
    printf("prank in deal %d\n", *prank);

}

}

int main() {

    int t, newcard;

    int stay = {false};
    int f;

    int rank = 0,  *prank = &rank;
    int totrank = 0, *ptotrank = &totrank;
    int num_cards = 2, *pnum_cards = &num_cards;
        printf("Prima del while %d\n", *pnum_cards);        

    printf("Your hand: ");

    while (*pnum_cards > 0) {
        deal(&num_cards, &rank);
//      printf("Nel while: %d\n", *pnum_cards);
//totrank_check(&totrank, &rank);
    }

    printf("\n");

    }
    return 0;

}

技术上它起作用。问题是,当我到达

时,我无法弄清楚原因
    printf("prank in deal %d\n", *prank);

这是函数deal()中的最后一个printf,它在第一个while循环中执行某些操作,它会打印该短语一千次,然后突然停止,它退出函数,执行第二个循环,调用再次运行,打印它所拥有的一切,到达最后一个printf,它打印一次并停止,就像预期一样。

所以我认为这不是while循环的问题,因为它基本上有效,它只是暂时停留在printf上一段时间。它可能是什么?

1 个答案:

答案 0 :(得分:3)

time ( NULL)返回秒数 一秒srand ( time ( NULL))会获得相同的种子 对于相同的种子,rand将生成相同的随机数列表 将srand ( time ( NULL))移动到main,以便只调用一次,而不是每次调用交易函数。