-3

I am new to the C language and I know there are a few Q&A out there about program crashes, but I think in this case my one is a bit specific and would prefer to make the question. I am attempting a Poker game and after running the program it crashes after I enter the "Y" or "N" command. I would appreciate any insights on how to solve this. Here's the code:

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

#define FALSE 0
#define TRUE 1

void printGreeting();
int getBet();
char getSuit(int suit);
char getRank(int rank);
void getFirstHand(int cardRank[], int cardSuit[]);
void getFinalHand(int cardRank[], int cardSuit[], int finalRank[],
                  int finalSuit[], int ranksinHand[],
                  int suitsinHand[]);
int analyzeHand(int ranksinHand[], int suitsinHand[]);

main(void) {
    int bet;
    int bank = 100;
    int i;
    int cardRank[5];
    int cardSuit[5];

    int finalRank[5];
    int finalSuit[5];
    int ranksinHand[13];
    int suitsinHand[4];
    int winnings;
    time_t t;
    char suit, rank, stillPlay;

    //print greeting
    printGreeting();

    // plays a new hand of draw poker

    do {
        bet = getBet();
        srand(time(&t));
        getFirstHand(cardRank, cardSuit);
        printf("Your five cards: \n");

        for (i=0; i<5; i++) {
            suit = getSuit(cardSuit[i]);
            rank = getRank(cardRank[i]);
            printf("Card #%d: %c%c\n", i+1, rank, suit);
        }


        for (i=0; i<4; i++) {
            suitsinHand[i] = 0;
        }

        for (i=0; i<13; i++) {
            ranksinHand[i] = 0;
        }

        getFinalHand(cardRank, cardSuit, finalRank, finalSuit,
                     ranksinHand, suitsinHand);

        printf("Your final five cards: \n");
        for (i = 0; i < 5; i++) {
            suit = getSuit(finalSuit[i]);
            rank = getRank(finalRank[i]);
            printf("Card #%d: %c%c\n", i+1, rank, suit);
        }

        winnings = analyzeHand(ranksinHand, suitsinHand);
        printf("You won %d!\n", bet*winnings);
        bank = bank - bet + (bet*winnings);
        printf("\nYour bank is now %d.\n", bank);
        printf("\nDo you want to play again? ");
        scanf(" %c", &stillPlay);
    } while (toupper(stillPlay) == 'Y');


    return 0;
}

/******************************************************************/

// Print a quick greeting as well as tell the users the value
// of different winning hands

void printGreeting() {

    printf("Here are the rules: \n");
    printf("You start with 100 credits, and you make a bet from ");
    printf("1 to 5 credits. \n");
    printf("You are dealt 5 cards, and then you choose which ");
    printf("cards to keep ");
    printf("or discard.\n");
    printf("You want to make the best possible hand. \n");
    printf("\nHere is the table for winnings (assuming a ");
    printf("bet of 1 credit):");
    printf("\nPair\t\t\t\t1 credit");
    printf("\nTwo Pairs\t\t\t2 credits");
    printf("\nThree Pairs\t\t\t3 credits");
    printf("\nStraight\t\t\t4 credits");
    printf("\nFlush\t\t\t\t5 credits");
    printf("\nFull House\t\t\t8 credits");
    printf("\nFour of a Kind\t\t\t10 credits");
    printf("\nStraight Flush\t\t\t20 credits");
    printf("\n\nHave Fun!!\n\n");
}

// Function to deal the first five cards

void getFirstHand(int cardRank[], int cardSuit[]) {
    int i, j;
    int cardDup;

    for (i=0; i < 5; i++) {
        cardDup = 0;
        do {
            cardRank[i] = (rand() %13);
            cardSuit[i] = (rand() %4);

            for (j=0; j < i; j++) {
                if ((cardRank[i] == cardRank[j]) &&
                    (cardSuit[i] == cardSuit[j])) {
                    cardDup = 1;
                }
            }
        } while (cardDup == 1);
    }
}

// Function that changes the Suit integer value to a character
// representing the suit

char getSuit(int suit) {
    switch (suit) {
    case 0:
        return('c');
    case 1:
        return('d');
    case 2:
        return('h');
    case 3:
        return('s');
    }
}

// Function that changes the rank integer value to a character
// representing the rank

char getRank(int rank) {
    switch (rank) {
    case 0:
        return('A');
    case 1:
        return('2');
    case 2:
        return('3');
    case 3:
        return('4');
    case 4:
        return('5');
    case 5:
        return('6');
    case 6:
        return('7');
    case 7:
        return('8');
    case 8:
        return('9');
    case 9:
        return('T');
    case 10:
        return('J');
    case 11:
        return('Q');
    case 12:
        return('K');
    }
}

// Function to get the user's bet, between 1 and 5

int getBet() {
    int bet;

    do {
        printf("How much do you want to bet? (Enter a number ");
        printf("1 to 5, or 0 to quit the game):");
        scanf(" %d", &bet);

        if (bet >= 1 && bet <= 5) {
            return(bet);
        } else if (bet == 0) {
            exit(1);
        } else {
            printf("\n\nPlease enter a bet from 1-5 or ");
            printf("0 to quit the game. \n");
        }
    } while ((bet < 0) || (bet > 5));
}

// Last function reviews the final hand and determines the value of
// the hand

int analyzeHand(int ranksinHand[], int suitsinHand[]) {
    int num_consec = 0;
    int i, rank, suit;
    int straight = FALSE;
    int flush = FALSE;
    int four = FALSE;
    int three = FALSE;
    int pairs = FALSE;

    for (suit = 0; suit < 4; suit ++)
        if (suitsinHand[suit] == 5)
            flush = TRUE;
    rank = 0;
    while (ranksinHand[rank] == 0)
        rank++;
    for (; rank < 13 && ranksinHand[rank]; rank++)
        num_consec++;
    if (num_consec == 5) {
        straight = TRUE;
    }
    for (rank = 0; rank < 13; rank++) {
        if (ranksinHand[rank] == 4)
            four = TRUE;
        if (ranksinHand[rank] == 3)
            three = TRUE;
        if (ranksinHand[rank] == 2)
            pairs++;
    }

    if (straight && flush) {
        printf("Straight Flush\n\n");
        return(20);
    } else if (four) {
        printf("Four of a Kind\n\n");
        return(10);
    } else if (three && pairs == 1) {
        printf("Full House\n\n");
        return(8);
    } else if (flush) {
        printf("Flush\n\n");
        return(5);
    } else if (straight) {
        printf("Straight\n\n");
        return(4);
    } else if (three) {
        printf("Three of a Kind\n\n");
        return(3);
    } else if (pairs == 2) {
        printf("Two Pairs\n\n");
        return(2);
    } else if (pairs == 1) {
        printf("Pair\n\n");
        return(1);
    } else {
        printf("High Card\n\n");
        return(0);
    }
}

void getFinalHand(int cardRank[], int cardSuit[], int finalRank[],
                  int finalSuit[], int ranksinHand[],
                  int suitsinHand[]) {
    int i, j, cardDup;
    char suit, rank, ans;

    for(i=0; i < 5; i++) {
        suit = getSuit(cardSuit[i]);
        rank = getRank(cardRank[i]);
        printf("Do you want to keep card #%d: %c%c", i+1, rank, suit);
        printf("\nPlease answer (Y/N): ");
        scanf(" %c", ans);
        if (toupper(ans) == 'Y') {
            finalRank[i] = cardRank[i];
            finalSuit[i] = cardSuit[i];
            ranksinHand[finalRank[i]]++;
            suitsinHand[finalSuit[i]]++;
            continue;
        } else if (toupper(ans) == 'N') {
            cardDup = 0;
            do {
                cardDup = 0;
                finalRank[i] = (rand() % 13);
                finalSuit[i] = (rand() % 4);

                for (j=0; j < 5; j++) {
                    if ((finalRank[i] == finalRank[j]) &&
                        (finalSuit[i] == finalSuit[j])) {
                        cardDup = 1;
                    }
                }
            } while (cardDup == 1);
            ranksinHand[finalRank[i]]++;
            suitsinHand[finalSuit[i]]++;
        }
    }
}
  • Please format your code correctly. – Badda Jun 07 '17 at 06:36
  • Please ___properly___ indent your code. Machine (Compiler) can read and compile anything, but for humans, it needs to make a little _sense_ while reading a block of text as _code_. :) – Sourav Ghosh Jun 07 '17 at 06:36
  • 2
    `main(void)`...`int main(void)` – Sourav Ghosh Jun 07 '17 at 06:37
  • 4
    _Questions seeking debugging help (why isn't this code working?) must include the desired behavior, a specific problem or error and the **shortest code necessary** to reproduce it in the question itself. Questions without a clear problem statement are not useful to other readers. See: How to create a [mcve]._ – Sourav Ghosh Jun 07 '17 at 06:37
  • 2
    `scanf(" %c", ans);` -> `scanf(" %c", &ans)` ? – Badda Jun 07 '17 at 06:41
  • Possible duplicate of [Reading a string with scanf](https://stackoverflow.com/questions/5406935/reading-a-string-with-scanf) – Badda Jun 07 '17 at 06:41
  • Thanks for the tip. Actually I am not sure what is the problem so that's why I posted the entire code. – O.Hernandez Jun 07 '17 at 06:44
  • 3
    @O.Hernandez and that is the purpose of asking for [mcve]. In the process of creating MCVE, most of the time, you will find the actual issue yourself. :) – Sourav Ghosh Jun 07 '17 at 06:45
  • @Badda VTC as typo then? – Sourav Ghosh Jun 07 '17 at 06:45
  • @O.Hernandez AKA 'I didn't do any debugging so that's why I posted the entire code'. – ThingyWotsit Jun 07 '17 at 06:48
  • Thanks guys for tips again! Yes I found something I forgot to add also that's why it was not working the way I wanted to. I am glad a community like you guys exist to help us who are new to programming learn! :) – O.Hernandez Jun 07 '17 at 06:53
  • @SouravGhosh Leaving out any of the operators relating to pointers/addresses is more likely a logical mistake (the kind appropriately being helped with here) than a simple typo. Isn't it? – Yunnosch Jun 07 '17 at 06:57
  • @Yunnosch No, it's a logical mistake when you make that in all the occurrences, not in one particular case. – Sourav Ghosh Jun 07 '17 at 06:59
  • @SouravGhosh Good point. – Yunnosch Jun 07 '17 at 06:59
  • The root of your problem here is that you either compile your project with no warnings enabled, or that you ignore the warnings. – August Karlstrom Jun 07 '17 at 08:14

1 Answers1

0

You have forgot & inside scanf in line number 276, So use this:

scanf(" %c", &ans);

instead of

scanf(" %c", ans);
msc
  • 33,420
  • 29
  • 119
  • 214