user3633036
user3633036

Reputation: 1

while statement is unable to read the correct char input

hi i am new to c++ and i dont understand why my while statement doesnt work now. it was working when i tried to do it earlier.

Full code is available at: http://pastebin.com/aeH5fKwh

basically here is the while loop (i excluded all the unnecessary parts, i left the inside of the while loop intact for viewing purpose)

int main()
{
unsigned int seed;
char input;
bool done;


for (int round = 0; round < 5; round++)
{
    done = false;
    cout << "\nEnter seed: ";
    cin >> seed;
    cout << "\nRound 1" << endl;

    while(!done)
    {
        cout << "\nDo you wish to draw another card [y][n]: ";
        cin >> input;

        while (input != 'y' && input != 'n')
        {
            cout << "Invalid input! Please enter [y][n]!" << endl;
            cin >> input;
        }
        if (input == 'y')
        {
            dealExtra(playerHand, deck, gameInfo);
            cout << "Your cards are ";
            printHand(playerHand, gameInfo.playerCardCount);
        }
        else
            done = true;
    }
}
cout << endl;
return 0;
}

when i try entering anything that is not 'y', 'n', it will tell me that my input is invalid. But when i try to enter 'y' or 'n', it kinda just ignored it and nothing else happened.. i checked with cout statement and found that it manage to get into the if (input == 'y') statement, but it doesnt seem like it is doing anything else. Everything was fine till 20 minutes ago and i really couldnt figure out whats wrong.

Edit: i ran another test using "cout << '[' << input << ']' << endl;".. it seems like the program is able to get my first input, but then it just hangs there afterwards.. what i get is something like:

 Do you wish to draw another card [y][n]: y
 [y]
 y
 y
 y
 y

I compiled this on linux terminal using g++

if extra codes is needed, i'll edit and add them.. thanks!

Upvotes: 0

Views: 132

Answers (4)

Thomas Matthews
Thomas Matthews

Reputation: 57688

When you ask for input from the console, most implementations buffer characters until a newline key is pressed.

After the newline is received, the first character of the buffer is returned. The newline still remains in the buffer as well as any extra characters.

In your case, the second cin >> input statement will read the newline from the buffer.

As an experiment, try entering "frog" and single step through your program. This should illustrate the case of residual characters in the buffer.

Try cin.ignore(1000, '\n') after the first cin >> input. The ignore method will eat up any remaining characters in the buffer until the newline is found.

Upvotes: 1

fredoverflow
fredoverflow

Reputation: 263128

You have an infinite loop inside checkComputerHand:

bool done = false;
while(!done)
{
    if(sum == 11 && checkAce == true)
    {
        computerHand[aceLocation].value = 11;
        done = true;
    }              
    if(sum > 11 && checkAce == true)
    {
        computerHand[aceLocation].value = 1;
        done = true;
    }
    // What if checkAce wasn't true? Infinite loop!
}

Also, the first two lines of newGame do not make any sense:

void newGame(Card playerHand[], Card computerHand[], Statistics &gameInfo)
{
    playerHand = '\0';
    computerHand = '\0';
    // ...
}

Array parameters are silently rewritten by the compiler as pointer parameters. So all you're doing is assigning the null pointer to those local pointers. Probably not what you intended...

Upvotes: 0

treshaque
treshaque

Reputation: 1

If you feel lazy to run a debugger, and plan to use cout<< statements to find a hanging call, you should flush you cout:

( cout << "I am here and going to hang" ).flush() ;

Otherwise you can't see recent output just because it's still in the output buffer. Try this and you well might see what call hangs your program.

Upvotes: 0

paper.plane
paper.plane

Reputation: 1197

Make below statements inactive

dealExtra(playerHand, deck, gameInfo);
printHand(playerHand, gameInfo.playerCardCount);

and check if it works, then try making one of the above statements active alternately to find out in which function the flow is getting lost. And so on.

Upvotes: 0

Related Questions