IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Lekce 1 - Zadávání vstupu z klávesnice v C# Konzoli

Vítejte u první lekce kurzu Konzole C# .NET a její možnosti. Obsahem této lekce bude vysvětlení, jak můžeme pro své aplikace zajistit zadávání potřebných dat z klávesnice. V konzolových aplikacích C# .NET základní podporu pro zajištění datového vstupu z klávesnice poskytuje třída Console, která obsahuje všechny potřebné metody a vlastnosti. V kurzu Základní konstrukce jazyka C# . NET jsme se s některými už seznámili. V této lekci se o nich dozvíme další podrobnosti a seznámíme se s dalšími, které naši programátorskou práci usnadní. Tak pojďme na to.

Jak načíst data z klávesnice

Načítání dat zadávaných z klávesnice řeší třída Console. Vstup ve třídě Console je standardně nasměrován právě na klávesnici, takže nemusíme nic nastavovat. Existuje ještě možnost vstup přesměrovat na nějaký soubor, odkud bychom mohli číst dříve uložená data, ale tím se nyní zabývat nebudeme.

Možnosti načítání dat z klávesnice máme v zásadě tři:

  • Buď potřebujeme načíst nějakou sadu znaků, typicky například jméno, věk, uživatelské heslo apod. Pro tyto případy použijeme metodu ReadLine().
  • Anebo potřebujeme načíst jeden znak resp. jednu klávesu, například Enter pro potvrzení volby, číslici, zadání volby Ano/Ne ( A / N ) apod. V tom případě použijeme metodu ReadKey().
  • Třetí možností je použití metody Read(), která umožňuje také načtení sady znaků, ale jednotlivě, znak po znaku.

Pojďme si tyto metody podrobně představit.

ReadLine()

Metoda ReadLine() je tou nejjednodušší možností, jak zadávat data z klávesnice. Metoda nedělá nic jiného, než že načítá zadávané znaky tak dlouho, dokud není stisknuta klávesa Enter. Načtený řetězec znaků vrací jako typ string. Délka načítaného řetězce je omezena 256 znaky. Prakticky můžeme ale zadat najednou pouze 254 znaků, protože při načtení řetězce se ještě standardně načítají dva ukončovací znaky - ASCII 13 (Carriage return) pro návrat na začátek řádku a ASCII 10 (Line feed) pro odřádkování. Tyto znaky se však nestávají součástí řetězce, takže ve svém řetězci máme pouze ty znaky, které jsme skutečně zadali.

Proto si v následujícím příkladu všimněme, že po zadání prvního slova se odřádkuje a kurzor se nastaví na začátek řádku. To způsobí, že požadavek na zadání druhého slova se zobrazí na novém řádku. Totéž se stane po zadání druhého slova, a proto i výpis výsledku začne na začátku nového řádku. Výsledná slova se pak ale vypisují za sebou na jeden řádek, aniž by po jejich vypsání došlo k odřádkování a návratu kurzoru na začátek řádku:

Console.Write("Zadej první slovo: ");
string slovo1 = Console.ReadLine();
Console.Write("Zadej druhé slovo: ");
string slovo2 = Console.ReadLine();
Console.Write("První a druhé slovo = "+ slovo1 + " " + slovo2);
Console.ReadKey();

Nejdelší řetězec znaků, který můžeme zadat najednou, je 254 znaků.

Konzolová aplikace
Zadej první slovo: pes
Zadej druhé slovo: kočka
První a druhé slovo = pes kočka

ReadKey()

Metoda ReadKey() zajistí zastavení běhu programu, který poté čeká na stisk klávesy. Po stisku libovolné klávesy program ihned pokračuje, tedy zadaný znak už nepotvrzujeme stiskem klávesy Enter. Takto ze vstupu načteme jeden znak.

V místě použití metody ReadKey() se běh programu zastaví. Toho se využívá umístěním metody na konci programu, anebo na libovolném místě uvnitř programového kódu, kde nepotřebujeme získat ze vstupu žádný znak, ale jen využijeme zastavení běhu programu. Například proto, abychom si mohli přečíst data z okna konzole. Běh programu následně pokračuje po stisku libovolné klávesy.

V závorce u metody ReadKey() lze použít parametr typu bool. Je-li parametr nastaven na true, zajistí, že se stisknuté klávesy nebudou vypisovat do konzole. Není-li uveden žádný parametr, anebo je nastaven na false, zadaný znak se při stisknutí klávesy vypíše.

Vlastnost ReadKey().Key a výčet ConsoleKey

Vlastnost Key vrací název klávesy, která byla stisknuta a nikoliv znak, který klávesa reprezentuje. Například název klávesy W bude vždy W, bez ohledu na to, zda přitom byla stisknuta některá z kláves Shift, Alt nebo Ctrl či jejich kombinace. Toho s výhodou využíváme v těch případech, kdy od uživatele očekáváme stisk nějaké určité klávesy. Takovou typickou volbou může být Ano/Ne, kde se požaduje stisk kláves A nebo N, anebo potvrzení klávesou Enter a podobně. Požadovanou klávesu si při psaní kódu vybereme z výčtu ConsoleKey, což je seznam všech dostupných kláves na klávesnici. Úplný seznam kláves v ConsoleKey se nám nabídne při psaní příkazu ve Visual Studiu. Vedle písmen (pouze velká písmena, která reprezentují název klávesy) a čísel tam jsou i klávesy Enter, Backspace, Delete, Esc, anebo šipky – LeftArrow, RightArrow, UpArrow a DownArrow.

Jako příklad si můžeme uvést požadavek na stisknutí klávesy Enter. Pomocí vlastnosti Key zjistíme název stisknuté klávesy a porovnáme jej s požadovanou klávesou v seznamu ConsoleKey. Smyčka v příkladu bude čekat tak dlouho, dokud nebude stisknuta klávesa Enter:

Console.WriteLine("Pro ukončení stiskni ENTER");
while (Console.ReadKey(true).Key != ConsoleKey.Enter){}

Všimněme si použití parametru true v závorkách metody ReadKey(true), který zajistí, že stisknuté klávesy se nebudou vypisovat.

Vlastnost ReadKey().KeyChar

Vlastnost KeyChar vrací načtený znak z klávesnice jako typ char. Například:

char znak;
Console.Write("Zadej znak: ");
znak = Console.ReadKey(true).KeyChar;
Console.Write("\n Znak = " + znak);
Console.ReadKey();

Výstup:

Konzolová aplikace
Zadej znak:
Znak = a

Read()

Tuto metodu si zde uvedeme pouze pro informaci, kdybychom se s ní setkali v cizích kódech. Doporučuji ji spíše nepoužívat. Její použití je poněkud těžkopádné. Všechny potřebné vstupy dokážeme realizovat pomocí dříve popsaných metod ReadLine() a ReadKey().

Metodu Read() můžeme použít v případě, kdy potřebujeme načíst sadu znaků, které po zadání potvrdíme klávesou Enter. Na rozdíl od metody ReadLine() tyto znaky budeme načítat jeden po druhém, stejně jako u metody ReadKey(). Zní to možná nelogicky, vysvětlíme si to.

Metoda Read() dokáže sama o sobě načíst jen jeden znak z klávesnice. Na rozdíl od metody ReadKey() zadaný znak musíme potvrdit klávesou Enter. Metoda Read() vrací znak jako číselnou hodnotu typu int. Zadáme-li metodě Read() více znaků, načte se opět pouze číselná hodnota jednoho znaku, a to toho prvního.

Vyzkoušejme si zadat místo jednoho znaku celé slovo:

int znak;
Console.Write("Zadej znak: ");
znak = Console.Read();
Console.WriteLine(znak);

Výstup:

Konzolová aplikace
Zadej znak: test
116

Ve výpisu vidíme, že se vypsala číselná hodnota pouze prvního znaku.

Co se stalo s ostatními zadanými znaky? Ty se neztratily, ale jsou uloženy ve vyrovnávací paměti a můžeme se k nim dostat pomocí cyklu a znaky z vyrovnávací paměti načíst metodou Read(). Zadávání řetězce znaků jsme ukončili stiskem klávesy Enter a to vygeneruje nám již dobře známé dva znaky ASCII 13 (Carriage return) pro návrat na začátek řádku a ASCII 10 (Line feed) pro odřádkování.

Na rozdíl od metody ReadLine() se tyto znaky stávají součástí řetězce a zapíší se na jeho konec. Díky tomu můžeme jednoduše testovat, zda už jsme na konci slova a cyklus ukončit. Testujeme tedy znaky na přítomnost ASCII 13, poté ukončíme cyklus a nakonec ještě jednou použijeme metodu Read() pro načtení posledního znaku ASCII 10, čímž vyprázdníme vyrovnávací paměť. Když už načítáme znaky pomocí cyklu, můžete je třeba počítat. Z načtené číselné hodnoty znaku můžeme také pomocí přetypování (char)znak zjistit, o jaký znak jde:

int znak;
int pocitadlo = 0;
Console.Write("Zadej slovo: ");
znak = Console.Read(); //Zadání slova z klávesnice, proměnná `znak` obsahuje pouze 1. písmeno
while (znak != 13)
{
Console.Write("\n Desítková hodnota znaku " + (char)znak + " je " + znak);
pocitadlo++;
znak = Console.Read(); //Načtení dalších písmen zadaného slova z vyrovnávací paměti jednoho po druhém
}
Console.Read(); // Načtení posledního znaku ASCII 10 z vyrovnávací paměti
Console.WriteLine("\n\n Zadal jsi slovo o " + pocitadlo + " znacích.");
Console.ReadKey();

Výstup:

Konzolová aplikace
Zadej slovo: Třezalka

Desítková hodnota znaku T je 84
Desítková hodnota znaku ř je 345
Desítková hodnota znaku e je 101
Desítková hodnota znaku z je 122
Desítková hodnota znaku a je 97
Desítková hodnota znaku l je 108
Desítková hodnota znaku k je 107
Desítková hodnota znaku a je 97

Zadal jsi slovo o 8 znacích.

V další lekci, Analýza dat ze vstupu z klávesnice v C# Konzoli, se dozvíme, co vše lze zjistit ze zadávaných dat z klávesnice a ukážeme si postupy, jak lze tyto informace získat a nakládat s nimi.


 

Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.

Stáhnout

Stažením následujícího souboru souhlasíš s licenčními podmínkami

Staženo 9x (313.23 kB)
Aplikace je včetně zdrojových kódů v jazyce C#

 

Všechny články v sekci
Konzole C# .NET a její možnosti
Přeskočit článek
(nedoporučujeme)
Analýza dat ze vstupu z klávesnice v C# Konzoli
Článek pro vás napsal Luděk Novotný
Avatar
Uživatelské hodnocení:
12 hlasů
Autor je technik, má rád stručné a jasné texty, a tak se také snaží psát články pro vás.
Aktivity