5. díl - Pokročilé zpracování vstupu a výstupu v jazyce C

C++ Pokročilé konstrukce Pokročilé zpracování vstupu a výstupu v jazyce C

V dnešní lekci se podíváme na pokročilé zpracování vstupů i výstupů. Již známe funkce printf() pro zápis do konzole a scanf() pro čtení. Povíme si, jak lze výstup (resp. vstup) pomocí těchto funkcí dále formátovat a také se podíváme na další funkce z knihovny stdio.h.

printf()

Printf() je základní funkce pro vypisování formátovaného výstupu. Vypíše text, který ji zadáme jako první argument. Navíc všechny sekvence začínající % nahradí proměnnými, které jí předáme jako další parametry. Zadat můžeme dále také flagy nebo určit přesnost desetinných čísel.

Vše dohromady zapíšeme v následujícím formátu:

%[Flag][Šírka][.Přesnost]Identifikátor

Hranaté závorky udávají, že je součást zápisu nepovinná.

Identifikátory

Zatím jsme si řekli jen o základních identifikátorech (%d, %c, %s), proto pro úplnost přidávám tabulku s dalšími typy.

Identifikátor Význam
d nebo i celé číslo se znaménkem
u celé číslo bez znaménka
o celé číslo v osmičkové soustavě (bez znaménka)
x celé číslo v šestnáctkové soustavě (bez znaménka)
f číslo s desetinnou čárkou
e číslo s desetinnou čárkou ve vědecké notaci (3.92e+2)
c znak
s řetězec znaků
p ukazatel

Pokud by vás zajímaly ještě další formáty, kompletní výčet naleznete v dokumentaci.

Flagy

printf() dále může přijímat různé flagy, které upravují jak bude výstup vypadat.

Flag Význam
- Řetězec bude zarovnán doleva (výchozí nastavení je doprava)
+ U čísla bude vždy znaménko (+ nebo -)
mezera Pokud se jedná o kladné číslo, bude na začátku vypsána mezera
# Pro identifikátory o a x přidá před číslo 0, respektive 0x, pro zbylá čísla zaručí, že bude vždy vypsaná desetinná čárka
0 Zarovná číslo zleva nulami v případě, že je nastavena šířka

Jak bylo zmíněno, můžeme nastavit i šířku pole, do kterého se bude vypisovat. Pokud zapíšeme číslo, určíme tím minimální počet znaků, který se vypíše. Pokud je vypisovaný řetězec kratší, je doplněn zleva mezerami. Druhou možností je použít hvězdičku. Tentokrát tím říkáme, že šířka není určena v řetězci, ale jako další parametr. Tento parametr je ještě před vypisovaným parametrem. Použití flagů si ukážeme za moment.

Přesnost

Poslední, co můžeme nastavit, je přesnost. Pro celá čísla funguje jako nastavení šířky, pro desetinná čísla udává hodnota počet znaků, které se vytisknou po desetinné čárce. Opět můžeme použít hvězdičku a doplnit další parametr, který bude specifikovat přesnost.

Návratová hodnota

S návratovou hodnotou je to velice přímočaré. Proběhne-li vše v pořádku, printf vrátí počet znaků, které zapsal. Nastane-li problém, funkce navrací zápornou hodnotu.

Příklady

To byla velká spousta teorie. Nyní se pojďme podívat na nějaké příklady.

printf("%s: %d %o %x\n", "(%d %o %x,14)", 14, 14, 14);
printf("%s: %5d %05d %+5d %-5d\n", "(%5d %05d %+5d %-5d,25)", 25, 25, 25, 25);
printf("%s: %.3f %.6f %.9f\n", "(%.3f %.6f %.9f,M_PI)", M_PI, M_PI, M_PI);
printf("%s: %25s\n", "(%25s,\"Ahoj svete!\"", "Ahoj svete!");
Příklad parametrů funkce printf

Scanf()

Pro čtení formátovaného vstupu naopak slouží funkce scanf. Tentokrát může být ve formátovacím řetězci i mezera (scanf() dále ignoruje všechny netisknutelné znaky, dokud nenarazí na první tisknutelný znak). Dále může formátovací řetězec obsahovat libovolný znak (na vstupu musí být stejný znak, jinak scanf() selže) a opět sekvence začínající %. Ale nebojte, není toho tolik co u printf :)

Mezi identifikátory přibyly hranaté závorky se znaky (například [abcd]). Takovému výrazu odpovídá libovolný znak ze závorek. Pokud přidáme ještě stříšku - [^abcd], tak závorku znegujeme a validní je vše, co není zmíněno.

Celý zápis formátovacího řetězce je

%[*][Šírka][Délka]Identifikátor

Hvězdička na začátku indikuje, že se mají data přečíst, ale neukládat. Šířka udává maximální počet znaků, které se přečtou, délka poté blíže specifikuje typ proměnné (například %lf znamená double). Bližší informace jsou v dokumentaci.

U scanf je návratová hodnota o něco zajímavější. Tentokrát funkce vrací počet přečtených parametrů. Počet může být i 0, nepodařilo-li se přečíst žádný parametr. Přitom je funkce implementovaná takových způsobem, že při prvním selhání se ukončí a dál nepokračuje.

Nyní by pro vás neměl být problém zpracovat libovolný vstup a vypsat cokoliv v libovolném formátu.

Neformátovaný vstup a výstup

C poskytuje ještě funkce pro neformátovaný vstup a výstup. Tyto funkce jsou přirozeně rychlejší, ale dokáží pouze vypsat text bez nějakých modifikací. U neformátovaného textu máme pouze dvě možnosti: buď zpracujeme jedno písmeno nebo celý řádek.

Pro přečtení jednoho znaku nám stačí funkce getchar(), naopak pro přečtení celého řádku nám poslouží funkce gets(). Obě funkce vrací hodnotu EOF, pokud došly na konec souboru. V příkazové řádce jej lze nasimulovat stisknutím Ctrl+Z (pro Windows) nebo Ctrl+D (pro Linux a Mac). Proč konec souboru? O tom si povíme v jednom z dalších dílů.

Neformátované vypisování funguje podobně. Funkce putchar() vypíše znak do konzole. Funkce puts() vypíše celý řetězec znaků.

char buffer[256] = {'a'};
char* p_temp = buffer;

// vypsani celeho radku
puts("Prvni ukazka:");
// rucni cteni az do konce radku
do
{
    *p_temp = getchar();
    if(*p_temp == '\n')
        *p_temp = '\0';
    p_temp++;
} while(p_temp[-1] != '\0'); // podivame se na predchozi znak
// vypsani precteneho retezce
printf("Precteno: %s\n", buffer);
// cteni do konce radku
gets(buffer);
// rucni vypsani
p_temp = buffer;
for(p_temp = buffer; *p_temp != '\0'; p_temp++)
    putchar(*p_temp);
Neformátovaný text – vstup a výstup

Všechny ukázky z lekce jsou ke stažení pod článkem. Pokud budete mít libovolnou otázku, můžete ji vložit do komentářů.


 

Stáhnout

Staženo 3x (62.71 kB)
Aplikace je včetně zdrojových kódů v jazyce c

 

  Aktivity (4)

Článek pro vás napsal patrik.valkovic
Avatar
Věnuji se programování v C++ a C#. Kromě toho také programuji v PHP (Nette) a JavaScriptu.

Jak se ti líbí článek?
Ještě nikdo nehodnotil, buď první!


 


Miniatura
Předchozí článek
Makra v programovacím jazyce C
Miniatura
Následující článek
Konstantní hodnoty

 

 

Komentáře

Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zatím nikdo nevložil komentář - buď první!