» Poradna » Programy

C# Načítání vstupu z konzole nečeká na zadání a Enter

 |   |  Microsoft Windows XP IE 8.0

Dobrý den.Začínám s C# a dělám cxelkém jednoduché úkoly na konzoli. Už podruhé se mi stalo, že sekvence pro načítání vstupu proběhne bez zastavení po kterém se má vstup načíst.Poprvé to bylo v situaci, kdy jsem měl funkci pro načtení znaku (char), kterou jsem volal s textovým parametrem jednou pro vstup znaku který se měl dále zpracovat a podruhé pro dotaz na to, zda se má pokračovat. Poprvé se znak načetl, při druhém volání se ale program na tom Console.ReadLine() nezastavil.Teď se mi to stalo podruhé v cyklu Do - While jsem měl načítání znaku, který se má vypsat a počtu, kolikrát se má vypsat do řádku. Při načítání počtu opakování to zase nefungovalo. Tak jsem to překopíroval před cyklus - příslušnou část kódu uvádím níže. Výsledek byl ten, že před cyklem jsem počet opakování v pohodě zadal, v rámci cyklu jsem pak zadal znak. V úplně stených dvou řádcích jako výše však program zase zhavaroval.Hledal jsem nějaký chyták, ale nevím. Jedno to blblo v načítání znaku pomocí Console.Read(), podruhé v načítání čísla pomocí Console.ReadLine(). Tak fakt netuším... Můžete mi, prosím, poradit?Předem děkuji, Lumír char hledany_znak, pokracovat = 'a'; int pocet_vyskytu = 0; Console.Write("\nZadejte, kolikrát chcete znak v řádku vypsat: "); pocet_vyskytu = int.Parse(Console.ReadLine()); do { hledany_znak = Vstup_znaku("\nZadejte znak, který chcete zobrazit do řádku: "); Console.Write("\nZadejte, kolikrát chcete znak v řádku vypsat: "); pocet_vyskytu = int.Parse(Console.ReadLine()); pocet_vyskytu = Vstup_poctu(); Vypsat_znaky(pocet_vyskytu, hledany_znak); pokracovat = Vstup_znaku("\nChcete-li zadat a tisknout Ukázat celý příspěvek

Mohlo by vás také zajímat

Odpovědi na otázku

 | Microsoft Windows 7 Chrome 31.0.1650.63

Co je obsahem metod:Vstup_znaku()Vstup_poctu()Vypsat_znaky()?pocet_vyskytu = int.Parse(Console.ReadLine());pocet_vyskytu = Vstup_poctu();Druhý vstup ti přepíše ten první, to ti nevadí?

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows XP IE 8.0

Díky za rychlou reakci.Vstup_znaku() - jednou načte znak do proměnné hledany_znak, podruhé znak do proměnné pokracovatVstup_poctu() - má načíst do proměnné pocet_vyskytu počet, kolikrát se znak z proměnné hledany_znak vypíše pomocí Console.Write() do řádku na konzoliVypsat_znaky() - pomocí For by měl vypsat na konzoli pocet_vyskytu krát znak z proměnné hledany_znakTo, že by se proměnná přepsala mi nevadí, udělal jsem to jenom na zkoušku. Jinak jsou ty řádky pouze v cyklu, kde ale nefungují. Před cyklus jsem to dal jenom proto, abych si zkusil, jestli to tam taky zhavaruje, protože se domnívám, že by to mělo fungovat (stejně jsem to udělal už mockrát, ale vždy jenom v úplně jednoduchých prográmcích. Teď začínám experimentovat s funkcemi a začínají komplikace - nevím jestli to nějak souvisí...Lumír

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows XP IE 8.0

Myslel jsem, že jsem to psal jasně, ale po přečtení jsem si uvědomil, že asi ne. Při dolaďování textu mi vypadla jedna věta, o překlepu na začátku ani nemluvím.Takže se omlouvám a upřesňuji, že mi jde o tyto řádky: Console.Write("\nZadejte, kolikrát chcete znak v řádku vypsat: "); pocet_vyskytu = int.Parse(Console.ReadLine());Jsou před cyklem a v cyklu. Před cyklem to funguje, v cyklu ne a netuším proč...Lumír

Souhlasím  |  Nesouhlasím  |  Odpovědět
 | Microsoft Windows 7 Chrome 31.0.1650.63

Co znamená "nefunguje"?

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows XP IE 8.0

Vypíše to text "Zadejte, kolikrát chcete znak v řádku vypsat:" a okamžitě se objeví dialog "V aplikaci .. došlo k problému a je nutné ji ukončit...". Na konzoli se pak pod výše uvedeným textem objeví text "Neošetřená výjimka: System.FormatException: Vstupní řetězec nemá správný formát" a příslušné odkazy... Prostě úplně stejně, jako bych odentroval bez zadání údaje. Možná nepřesně jsem to v původním dotazu popsal "Poprvé se znak načetl, při druhém volání se ale program na tom Console.ReadLine() nezastavil." Co nechápu je, že stejné řádky použité na jednom místě čekají na zadání vstupu a Enter a na jiném místě ne.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows XP IE 8.0

Pokud Vás to nebude obtěžovat, poslal jsem Vám mailem oba programy, kde se mi problém vyskytuje. Možná to pro Vás bude snazší na pochopení toho, oč mi jde i pro nalezení chyby.Lumír

Souhlasím  |  Nesouhlasím  |  Odpovědět
 | Microsoft Windows 7 Chrome 31.0.1650.63

Odpovím sem, aby z toho něco měli i ostatní.Problém je v používání Console.Read(), která sice čeká na Enter, ale ze vstupu přečte pouze první znak a zbytek nechá v bufferu. V bufferu ale zůstává stisknutý Enter a ten ukončí následující Console.ReadLine(), takže není vlastně načtené nic. To nic se pak parsuje na integer a na tom to samozřejmě spadne.Možná řešení:- nepoužívat Console.Read() ale pouze Console.ReadLine()- po každém volání Console.Read() zavolat Console.ReadLine(), ale jeho výsledek nikam neukládat- používat pro čtení znaku metodu Console.ReadKey() - ta nečeká na stisknutí Enteru.

Souhlasím  |  Nesouhlasím  |  Odpovědět

Související témata: Console, Zadání, Enter, Konzole, Znak, Parse, Opakování, Char