Błąd przy powtórnym użyciu Console.ReadLine()

0

Cześć,
ostatnio wziąłem się za pisanie programów i często natykam się na taki błąd:
-piszę program z menu,
-użytkownik wybiera opcję w menu,
-wykonuje się działanie programu(przy czym zostają pobrane od użytkownika dane - int x = int.Parse(Console.ReadLine());)
-powraca do menu,
-i znowu może wybrać tą samą opcję tyle że od zera,

Tym czasem kompilator wypisuje błąd:
Nieprawidłowy format ciągu wejściowego.

I nie wiem o co chodzi, gdyż za pierwszym razem wszystko działa poprawnie.

0

Szklana kula poszła do polerki, ale najprawdopodobniej w buforze klawiatury zostają ci jakieś śmieci, których int.Parse nie trawi. Wyświetl sobie (z cudzysłowami) albo sprawdź pod debugerem co tam wyczytujesz:

string s = Console.ReadLine();
Console.WriteLine("odczytano: '"+s+"'");
0
Azarien napisał(a):

Szklana kula poszła do polerki, ale najprawdopodobniej w buforze klawiatury zostają ci jakieś śmieci, których int.Parse nie trawi. Wyświetl sobie (z cudzysłowami) albo sprawdź pod debugerem co tam wyczytujesz:

string s = Console.ReadLine();
Console.WriteLine("odczytano: '"+s+"'");

Za pierwszym cyklem programu wszystko jest okey i jest poprawnie napisane. Dopiero kiedy drugi raz pobieram te dane pojawia się problem.

0
class Program
    {
        static void Losowanie_1_1000()
        {
            Console.Clear();
            int x = DateTime.Now.Millisecond;
            System.Console.WriteLine(x);
            System.Console.WriteLine("Strzelaj, została wylosowana liczba z przedziału od 1 do 1000:");
            bool warunek = false;
            while (warunek == false)
            {
                int strzał = 0;
                ++strzał;
                int Wybór;
                Wybór = int.Parse(Console.ReadLine());
                if (x == Wybór)
                {
                    warunek = true;
                    System.Console.WriteLine("Wygrałeś brawo! Liczba oddanych strzałów:" + strzał);
                    System.Console.WriteLine("Wciśnij Enter, aby kontynuować");
                    Console.ReadLine();
                    Menu();
                    Wybór = 0;
                }
                if (x < Wybór)
                {
                    System.Console.WriteLine("Nie trafiłeś :(, strzelaj niżej.");
                }
                if (x > Wybór)
                {
                    System.Console.WriteLine("Nie trafiłeś :(, strzelaj wyżej.");
                }

            }
        }

        static void Menu()
        {
            Console.Clear();
            System.Console.WriteLine("Witaj w losowance!");
            System.Console.WriteLine("Wybierz, co chcesz robić:");
            System.Console.WriteLine("1. Zgaduj liczbę z przedziału 1-100");
            System.Console.WriteLine("2. Zgaduj liczbę z przedziału 1-1000");
            System.Console.WriteLine("3. Zgaduj liczbę z przedziału 1-10000");
            System.Console.WriteLine("4. Zgaduj liczbę z przedziału 1-100000");
            System.Console.WriteLine("5. O programie.");
            System.Console.WriteLine("0. Opuść program.");
            ConsoleKeyInfo Key;
            Key = Console.ReadKey(true);
            switch (Key.KeyChar)
            {
                case '1':
                    break;
                case '2':
                    Losowanie_1_1000();
                    break;
                case '3':
                    break;
                case '4':
                    break;
                case '5':
                    Console.Clear();
                    System.Console.WriteLine("O programie:");
                    Console.ReadLine();
                    Menu();
                    break;
                case '0':
                    break;
            }

        }

        static void Main(string[] args)
        {

            Menu();
        }
    }

Wiem że najprawdopodobniej chodzi o to że nie mogę po raz drugi użyć int.Parse, ale nie wiem też jak to ominąć.

0

Nie wyraziłeś ochoty rozwiązania problemu samemu. A podałem ci podpowiedź jak sprawdzić co się dzieje.

                System.Console.WriteLine("Wciśnij Enter, aby kontynuować");
                Console.Read();

Tu powinno być ReadLine, bo inaczej enter zostaje ci w buforze klawiatury i tam gdzie masz int.Parse(Console.ReadLine()); wczytuje ci pustego stringa.

                System.Console.WriteLine("Wciśnij Enter, aby kontynuować");
                Console.Read();
                Menu();

To Menu() jest bardzo złym pomysłem, bo jest to wywołanie tzw. „reentrantne”, tj. jesteś w funkcji Menu, która wywołała Losowanie_1_1000, w której to od nowa wywołujesz Menu. I chociaż potrzeba by kilku tysięcy takich zagnieżdżeń żeby przepełnić stos i wywalić program, to należy się wystrzegać dla zasady nawet jednego, jeśli nie wie się dokładnie co się robi (np. przy algorytmie rekurencyjnym).

0

Dzięki za pomoc. Udało się naprawić. Widzę że lepiej jest uruchomić konsolę ponownie(poprzez jej auto restart). Z tym, "reentrante" to w sumie wiedziałem że on nie wraca do początku tylko się cały czas zapętla, ale dopiero teraz zauważyłem że to jest faktycznie zły pomysł.

1 użytkowników online, w tym zalogowanych: 0, gości: 1