Code:

#include <stdlib.h>
#include "baralho.h"
const card_t uno[TAMBAR] = {
COR_VERMELHO | RANK_ZERO,
COR_VERMELHO | RANK_UM, COR_VERMELHO | RANK_UM,
COR_VERMELHO | RANK_DOIS, COR_VERMELHO | RANK_DOIS,
COR_VERMELHO | RANK_TRES, COR_VERMELHO | RANK_TRES,
COR_VERMELHO | RANK_QUATRO, COR_VERMELHO | RANK_QUATRO,
COR_VERMELHO | RANK_CINCO, COR_VERMELHO | RANK_CINCO,
COR_VERMELHO | RANK_SEIS, COR_VERMELHO | RANK_SEIS,
COR_VERMELHO | RANK_SETE, COR_VERMELHO | RANK_SETE,
COR_VERMELHO | RANK_OITO, COR_VERMELHO | RANK_OITO,
COR_VERMELHO | RANK_NOVE, COR_VERMELHO | RANK_NOVE,
COR_VERMELHO | RANK_PULAR, COR_VERMELHO | RANK_PULAR,
COR_VERMELHO | RANK_PESCARDOIS, COR_VERMELHO | RANK_PESCARDOIS,
COR_VERMELHO | RANK_INVERTER, COR_VERMELHO | RANK_INVERTER,
COR_VERDE | RANK_ZERO,
COR_VERDE | RANK_UM, COR_VERDE | RANK_UM,
COR_VERDE | RANK_DOIS, COR_VERDE | RANK_DOIS,
COR_VERDE | RANK_TRES, COR_VERDE | RANK_TRES,
COR_VERDE | RANK_QUATRO, COR_VERDE | RANK_QUATRO,
COR_VERDE | RANK_CINCO, COR_VERDE | RANK_CINCO,
COR_VERDE | RANK_SEIS, COR_VERDE | RANK_SEIS,
COR_VERDE | RANK_SETE, COR_VERDE | RANK_SETE,
COR_VERDE | RANK_OITO, COR_VERDE | RANK_OITO,
COR_VERDE | RANK_NOVE, COR_VERDE | RANK_NOVE,
COR_VERDE | RANK_PULAR, COR_VERDE | RANK_PULAR,
COR_VERDE | RANK_PESCARDOIS, COR_VERDE | RANK_PESCARDOIS,
COR_VERDE | RANK_INVERTER, COR_VERDE | RANK_INVERTER,
COR_AMARELO | RANK_ZERO,
COR_AMARELO | RANK_UM, COR_AMARELO | RANK_UM,
COR_AMARELO | RANK_DOIS, COR_AMARELO | RANK_DOIS,
COR_AMARELO | RANK_TRES, COR_AMARELO | RANK_TRES,
COR_AMARELO | RANK_QUATRO, COR_AMARELO | RANK_QUATRO,
COR_AMARELO | RANK_CINCO, COR_AMARELO | RANK_CINCO,
COR_AMARELO | RANK_SEIS, COR_AMARELO | RANK_SEIS,
COR_AMARELO | RANK_SETE, COR_AMARELO | RANK_SETE,
COR_AMARELO | RANK_OITO, COR_AMARELO | RANK_OITO,
COR_AMARELO | RANK_NOVE, COR_AMARELO | RANK_NOVE,
COR_AMARELO | RANK_PULAR, COR_AMARELO | RANK_PULAR,
COR_AMARELO | RANK_PESCARDOIS, COR_AMARELO | RANK_PESCARDOIS,
COR_AMARELO | RANK_INVERTER, COR_AMARELO | RANK_INVERTER,
COR_AZUL | RANK_ZERO,
COR_AZUL | RANK_UM, COR_AZUL | RANK_UM,
COR_AZUL | RANK_DOIS, COR_AZUL | RANK_DOIS,
COR_AZUL | RANK_TRES, COR_AZUL | RANK_TRES,
COR_AZUL | RANK_QUATRO, COR_AZUL | RANK_QUATRO,
COR_AZUL | RANK_CINCO, COR_AZUL | RANK_CINCO,
COR_AZUL | RANK_SEIS, COR_AZUL | RANK_SEIS,
COR_AZUL | RANK_SETE, COR_AZUL | RANK_SETE,
COR_AZUL | RANK_OITO, COR_AZUL | RANK_OITO,
COR_AZUL | RANK_NOVE, COR_AZUL | RANK_NOVE,
COR_AZUL | RANK_PULAR, COR_AZUL | RANK_PULAR,
COR_AZUL | RANK_PESCARDOIS, COR_AZUL | RANK_PESCARDOIS,
COR_AZUL | RANK_INVERTER, COR_AZUL | RANK_INVERTER,
COR_PRETO | RANK_CORINGA,
COR_PRETO | RANK_CORINGA,
COR_PRETO | RANK_CORINGA,
COR_PRETO | RANK_CORINGA,
COR_PRETO | RANK_CORINGAQUATRO,
COR_PRETO | RANK_CORINGAQUATRO,
COR_PRETO | RANK_CORINGAQUATRO,
COR_PRETO | RANK_CORINGAQUATRO
};
void embaralhar(card_t *deck, size_t cards)
{
size_t i = cards;
while (i > 1) {
const size_t k = rand() % i;
const card_t temp = deck[k];
i--;
deck[k] = deck[i];
deck[i] = temp;
}
}

Note the rewritten shuffle function. It is a basic
Code:

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <time.h>
#include "baralho.h"
const char *card_name(const card_t card)
{
static char buffer[128];
switch (RANK(card)) {
case RANK_ZERO: strcpy(buffer, "zero"); break;
case RANK_UM: strcpy(buffer, "um"); break;
case RANK_DOIS: strcpy(buffer, "dois"); break;
case RANK_TRES: strcpy(buffer, "tres"); break;
case RANK_QUATRO: strcpy(buffer, "quatro"); break;
case RANK_CINCO: strcpy(buffer, "cinco"); break;
case RANK_SEIS: strcpy(buffer, "seis"); break;
case RANK_SETE: strcpy(buffer, "sete"); break;
case RANK_OITO: strcpy(buffer, "oito"); break;
case RANK_NOVE: strcpy(buffer, "nove"); break;
case RANK_PULAR: strcpy(buffer, "pular"); break;
case RANK_PESCARDOIS: strcpy(buffer, "pescardois"); break;
case RANK_INVERTER: strcpy(buffer, "inverter"); break;
case RANK_CORINGA: strcpy(buffer, "coringa"); break;
case RANK_CORINGAQUATRO: strcpy(buffer, "coringaquatro"); break;
default: strcpy(buffer, "?"); break;
}
switch (COR(card)) {
case COR_VERMELHO: strcat(buffer, " vermelho"); break;
case COR_VERDE: strcat(buffer, " verde"); break;
case COR_AMARELO: strcat(buffer, " amarelo"); break;
case COR_AZUL: strcat(buffer, " azul"); break;
}
/* Because buffer is declared static, it remains between calls.
* Therefore, we can return a pointer to it.
* The next call to this function will overwrite the previous value.
*/
return (const char *)buffer;
}
int main(void)
{
card_t baralho[TAMBAR];
int i;
/* Randomize using time in seconds. */
srand(time(NULL));
/* Copy original deck to b. */
memcpy(baralho, uno, sizeof uno);
/* Shuffle all the cards in baralho. */
embaralhar(baralho, TAMBAR);
/* Print the deck. */
for (i = 0; i < TAMBAR; i++)
printf("%3d. %s\n", i + 1, card_name(baralho[i]));
return 0;
}

In the card_name() function, the