Search code examples
c#console.readline

Why do I need 2 Console.ReadLine(); to pause the console?


I'm just learning c#, and I like to understand everything before I move on.

The problem I'm having is I need 2 Console.ReadLine(); to pause the console. If I just use 1, the program ends after the input. So why does it need 2 readline methods instead of? Any ideas?

Please note in my code, I've commented out 1 of the readline methods, the way I want my program to work but it doesn't. However removing the comments allows the program to work, but I don't understand why.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CoinFlip
{
    class Program
    {
        static void Main(string[] args)
        {

            Random rng = new Random();
            Console.WriteLine(@"

This program will allow you to guess heads or tails on a coin flip.

Please enter h for heads, or t for tails and press Enter: ");

            char userGuess = (char)Console.Read();
            int coin = rng.Next(0,2);

            Console.WriteLine("Coin is {0}\n\n", coin);


            if (coin == 0 && (userGuess == 'h' || userGuess == 'H'))
            {

                Console.WriteLine("It's heads! You win!");

            }
            else if (coin == 1 && (userGuess == 't' || userGuess == 'T'))
            {
                Console.WriteLine("It's tails! You win!");

            }
            else if (userGuess != 't' && userGuess != 'T' && userGuess != 'h' && userGuess != 'H') 
            { 
                Console.WriteLine("You didn't enter a valid letter"); 
            }

            else
            {

                if (coin == 0) { Console.WriteLine("You lose mofo. The coin was heads!"); }
                if (coin == 1) { Console.WriteLine("You lose mofo. The coin was tails!"); }

            }
            Console.ReadLine();
            //Console.ReadLine();
        }
    }
}

Solution

  • You're using Console.Read(), which reads a single character after the user has hit return. However, it only consumes that single character - which means the rest of the line (even if it's empty) is still waiting to be consumed... which Console.ReadLine() is doing.

    The simplest fix to this is to use Console.ReadLine() earlier too:

    string userGuess = Console.ReadLine();
    

    .. then maybe check that the guess was a single character, or just change all your character literals (e.g. 't') to string literals (e.g. "t").

    (Or use Console.ReadKey() as Servy suggested. It depends on whether you want the user to hit return or not.)