Lekce 5 - Textový výstup a speciální znaky v C# Konzoli
V předchozí lekci, Textový výstup a složené formátování v C# Konzoli, jsme si ukázali, jak ovládat textový
výstup svých aplikací do okna konzole pomocí metody Write()
s
použitím složeného formátování.
V dnešním C# tutoriálu si ukážeme metodu WriteLine()
třídy Console
, která nám umožňuje provádět výpis textu do
okna konzole. Zároveň věnujeme prostor představení speciálních
znaků a escapování.
Metoda WriteLine()
je prakticky stejná jako metoda
Write()
, pouze s jedním podstatným rozdílem. U metody
WriteLine()
se na konci standardně vypisují nám už 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í. To způsobí, že při použití metody
WriteLine()
každý nový výpis začne na začátku nového
řádku.
Pokud bychom metodě Write()
zadali k vypsání tyto dva znaky,
pak dosáhneme stejného výsledku jako metodou WriteLine()
.
Můžeme to udělat dvěma způsoby, a to buď zadáním přetypovaných
ASCII hodnot znaků, nebo použitím speciálních
znaků.
Ukažme si syntaxi zápisu, kdy tři různé zápisy příkazového řádku nám dají totožný výsledek:
{CSHARP_CONSOLE}
Console.WriteLine("1. Použití metody WriteLine().");
Console.Write("2. Použití přetypování ASCII znaků."+(char)13+(char)10);
Console.Write("3. Použití speciálních znaků.\r\n");
Console.Write("Ve všech třech případech došlo k výpisu na začátku nového řádku.");
{/CSHARP_CONSOLE}
Výstup:
Konzolová aplikace
1. Použití metody WriteLine().
2. Použití přetypování ASCII znaků.
3. Použití speciálních znaků.
Ve všech třech případech došlo k výpisu na začátku nového řádku.
Zde vidíme, že po každém výpisu došlo k návratu na začátek řádku a k odřádkování.
Speciální znaky
Speciální znaky jsme již nakousli, pojďme si je probrat důkladněji. Co
jsou to speciální znaky? Jsou to znaky, které nám umožňují
ovládat výpis. Používají se ve vypisovaných řetězcích
a vždy je uvádí zpětné lomítko \
. Za lomítkem pak píšeme
znak, který má požadovanou speciální funkci.
Zpětné lomítko \
můžeme napsat pomocí
kombinace kláves Pravý Alt+Q
Pojďme si speciální znaky ukázat:
\n
Výpis textu na novém řádku.\r
Návrat kurzoru na začátek vypisovaného řádku.\t
Výpis mezery tabulátoru. Funguje stejně, jako když při psaní na klávesnici stiskneme tabulátor Tab.\"
Výpis uvozovek v textu. Pokud bychom před uvozovkami nepoužili zpětné lomítko, systém by uvozovky považoval za začátek, či konec vypisovaného řetězce.\\
Výpis samotného zpětného lomítka. Používáme ho např. při zápisu cesty k určitému souboru.
Výpis zpětného lomítka
Jelikož například v zápisu cesty k určitému souboru bývá zpětných lomítek více, existuje možnost označený řetězec vypsat bez interpretace zpětných lomítek do řídících znaků.
To uděláme tak, že před vypisovaným řetězcem uvedeme @
.
Tento způsob nazýváme escapování
a systém poté celý
řetězec interpretuje doslovně, tedy jako znaky k
výpisu.
Pojďme se podívat na příklad, jak můžeme pomocí \\
a
@
provést výpis cesty k souboru:
{CSHARP_CONSOLE}
Console.WriteLine("Cesta k souboru C:\\Dokumenty\\Ruzne\\Foto1.jpg");
Console.WriteLine(@"Cesta k souboru C:\Dokumenty\Ruzne\Foto1.jpg");
{/CSHARP_CONSOLE}
Výsledek obou zápisů bude totožný:
Konzolová aplikace
Cesta k souboru C:\Dokumenty\Ruzne\Foto1.jpg
Cesta k souboru C:\Dokumenty\Ruzne\Foto1.jpg
Výpis znaků Unicode
Posledním speciálním znakem, který si představíme, bude
\u0000
. Tímto speciálním znakem vypisujeme znaky
Unicode, kde místo 0000
píšeme číslo
požadovaného znaku. Pamatujme, že kódové označení požadovaného
znaku zadáváme jako číslo v šestnáctkové soustavě.
Jak číslo požadovaného znaku zjistit? Požadované znaky a jejich
kódové označení můžeme snadno vyhledat v aplikaci Mapa
znaků ve Windows. Mapu znaků vyvoláme z nabídky Start
zadáním klíčových slov Mapa znaků
. Objeví se nám tato
tabulka:
Klikneme-li ukazatelem myši na nějaký znak, nejen se zvýrazní, ale dole
se nám ještě objeví jeho Unicode číslo. Na obrázku je
vidět zvýrazněné písmeno W
a jeho Unicode číslo v
šestnáctkové soustavě 0057
. Pokud bychom chtěli tento znak
vypsat, zadali bychom: \u0057
. Stejně tak můžeme W
vypsat jako ASCII znak po přetypování (char)87
.
Číslo 57
v šestnáctkové soustavě je
87
v desítkové soustavě.
Použití Unicode kódování má oproti ASCII obrovskou výhodu v
množství použitelných znaků, které je mnohem větší.
Unicode znak můžeme také vypsat pomocí jeho čísla v šestnáctkové
soustavě, které převedeme na znak příkazem
Convert.ToChar(0x0000)
.
Místo 0000
zadáme Unicode číslo, které pro
určitý znak zjistíme z Mapy znaků.
V příkladu si tyto možnosti ukážeme pro znak W
:
Console.WriteLine("Zadání znaku pomocí speciálního znaku \\u0057: \tZnak = \u0057"); Console.WriteLine("Zadání znaku jako šestnáctkové číslo 0x0057: \tZnak = " + Convert.ToChar(0x0057)); Console.WriteLine("Zadání znaku jako číslo ASCII kódu (char)87: \tZnak = " + (char)87);
Výstup:
Konzolová aplikace
Zadání znaku pomocí speciálního znaku \u0057: Znak = W
Zadání znaku jako šestnáctkové číslo 0x0057: Znak = W
Zadání znaku jako číslo ASCII kódu (char)87: Znak = W
Všimněme si použití speciálního znaku tabulátoru
\t
, který nám znaky hezky zarovná.
Vykreslení rámečku
Ukažme si, jak vypsat znaky, které lze použít k nakreslení dvojitého
rámečku. Když se podíváme na mapu znaků, tak zjistíme, že tyto znaky se
nacházejí od adresy 0x2550
do 0x256C
. Až budeme v
dalších kapitolách probírat možnosti grafiky, budou se nám tyto znaky
hodit.
Nejdříve si zadáme počáteční a koncovou adresu požadovaného výpisu a z těchto hodnot vypočteme počet znaků:
ushort pocatek = 0x2550; ushort konec = 0x256C; int pocetZnaku = konec - pocatek;
Pak připravíme cyklus pro výpis vypočteného počtu znaků:
for (int i = 0; i <= pocetZnaku; i++) { }
Další příkazy píšeme dovnitř cyklu. Znaky budeme vypisovat po osmi na řádku, a pak provedeme vždy odřádkování:
if (i % 8 == 0) Console.WriteLine();
Poté vypíšeme adresu znaku pomocí složeného formátování se
specifikátorem formátu X
. Vedle adresy si zobrazíme
příslušný znak tak, že vypočtenou adresu převedeme na
znak:
Console.Write("{0,-4:X} ", pocatek + i); Console.Write("{0,-4}", Convert.ToChar(pocatek + i));
Kompletní kód vypadá takto:
{CSHARP_CONSOLE}
ushort pocatek = 0x2550;
ushort konec = 0x256C;
int pocetZnaku = konec - pocatek;
for (int i = 0; i <= pocetZnaku; i++)
{
if (i % 8 == 0) // Budeme vypisovat znaky po osmi na řádku
Console.WriteLine(); // Odřádkování
Console.Write("{0,-4:X} ", pocatek + i);
Console.Write("{0,-4}", Convert.ToChar(pocatek + i));
}
{/CSHARP_CONSOLE}
Vypíší se nám znaky včetně jejich adres:
Konzolová aplikace
2550 ═ 2551 ║ 2552 ╒ 2553 ╓ 2554 ╔ 2555 ╕ 2556 ╖ 2557 ╗
2558 ╘ 2559 ╙ 255A ╚ 255B ╛ 255C ╜ 255D ╝ 255E ╞ 255F ╟
2560 ╠ 2561 ╡ 2562 ╢ 2563 ╣ 2564 ╤ 2565 ╥ 2566 ╦ 2567 ╧
2568 ╨ 2569 ╩ 256A ╪ 256B ╫ 256C ╬
V případě, že by se na adrese žádný znak nenacházel, vypsal by se otazník.
V další lekci, Grafický výstup v C# Konzoli - Parametry okna Konzole , si ukážeme, jak se dají zjistit a nastavit parametry, které určují grafickou podobu okna konzole.
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 8x (146.05 kB)
Aplikace je včetně zdrojových kódů v jazyce C#