函数中的 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 重复打印,然后停止并正常工作的主要内容,如果未能解决你的问题,请参考以下文章
while循环保持打印和重复,我的getch出了什么问题? [重复]