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

Posted

技术标签:

【中文标题】函数中的 printf 重复打印,然后停止并正常工作【英文标题】:printf in a function repeatedly prints, then stops and works correctly 【发布时间】:2015-04-26 16:02:41 【问题描述】:

我正在用 C 编写一个二十一点程序,只是因为,我遇到了奇怪的错误。

这是代码(对不起,所有的注释行,我正在努力追查这个错误):

    #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 上停留了一段时间。会是什么?

【问题讨论】:

@YuHao,你是对的,对不起! @user3121023:这已经是解决方案了。请考虑将其发布为答案。 (使用相同的种子,即时间值相同时,会生成相同的卡片。) @user3121023 我不敢相信这有效。但这是为什么呢?你能给我解释一下吗? @MOehm 不过这不是问题(我认为)。它只是一遍又一遍地打印相同的值,但它在某个点停止(不知道为什么)并且它按预期工作。 这个想法是只为伪随机生成器播种一次。你在每张牌之前播种。 time 返回某个日期(纪元)之后的秒数。您一遍又一遍地生成相同的数字,直到系统时钟提前一秒。因为你只抽两张牌,所以第二次选择会成功。如果你抽十张牌,你会在九秒后得到很多输出和十张牌。但是 user3121023 已经在他的回答中解释了这一点。 【参考方案1】:

time ( NULL) 返回秒数。 一秒钟 srand ( time ( NULL)) 将获得相同的种子。 对于相同的种子,rand 将生成相同的随机数列表。 将 srand ( time ( NULL)) 移动到 main 中,这样它只会被调用一次,而不是每次调用 deal 函数时。

【讨论】:

以上是关于函数中的 printf 重复打印,然后停止并正常工作的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 printf 在 C 中打印无穷大符号 [重复]

while循环保持打印和重复,我的getch出了什么问题? [重复]

停止并继续javascript函数[重复]

printf 跳过字符数组的第一个字符[重复]

为什么printf()在实际数据之前打印ffffff。 C [重复]

C语言打印1-100的所有数,每打10个数换行该怎么弄?