Vstupy a výstupy

Programování by mělo jen malý smysl, kdyby celé programy fungovaly nezávisle na vnějším světě. Proto naprostá většina programů potřebuje přijímat data (vstupy) a vracet výsledky (výstupy).

Vstupy mohou být například:

Výstupy mohou být například:

V jazyce C zajišťuje základní práci se vstupem a výstupem knihovna v hlavičkovém souboru standard input & output (stdio.h). Operační systém každému spuštěnému programu automaticky přiřazuje:

<include stdio.h>  //voláme na začátku programu, abychom mohli používat vstupy a výstupy

stdin //standardní vstup, typicky klávesnice
stdout //standardní výstup, typicky okno terminálu nebo konzole

Základní funkce pro vstup a výstup v jazyce C

Výstup

Nyní si na příkladech ukážeme jednoduché použití těchto funkcí. Nejprve začneme s prostým výpisem:

printf("Ahoj světe");

vypíše do terminálu zprávu Ahoj světe.

Složitější to ale je, když chceme vypsat nějakou proměnnou. Zde musíme vědět, jakého typu daná proměnná je a do uvozovek namísto ní uvedeme tzv. zástupné znaky nebo formátovací specifikátory. Ty jsou:

Máme-li tedy například proměnnou vek, která je typu celé číslo, můžeme ji jednoduše vypsat:

int vek = 15;
printf("%d", vek);

Na začátku jsme si raději provedli deklaraci proměnné vek a rovnou inicializovali její hodnotu na 15. Ve druhém příkazu jsme do uvozovek dali pouze zástupný znak pro celé číslo a za uvozovky a čárku uvedli název vypisované proměnné. Do uvozovek můžeme přidat klidně i text, který se jenom vypíše:

int vek = 20;
printf("Uživateli je %d let.", vek);

Nyní se vypíše Uživateli je 20 let. Vlastně se vypíše všechno v uvozovkách, pouze místo zástupného znaku se vypíše proměnná, jejíž název je uveden za uvozovkami.

A co když máme více proměnných, které chceme vypsat najednou?

Můžeme je jednoduše za sebe poskládat:

int den = 16;
int mesic = 10;
int rok = 2026;
printf("Nastavený datum je %d. %d. %d.", den, mesic, rok);

Opět vidíme, že se vypsal celý text v uvozovkách, jenom místo zástupných znaků se vypsaly hodnoty proměnných uvedených za uvozovkami. Zde je nutné dodržet pořadí a počet zástupných znaků se musí rovnat počtu názvu proměnných za uvozovkami. Nejde tedy například:

printf("Student č. %d má v roce %d průměr z PVA %f.", student); //tři zástupné znaky, ale pouze jedna proměnná <–– CHYBA

Vidíme, že v uvozovkách máme postupně tři zástupné znaky, ale za uvozovkami je pouze jedna proměnná student. To je chyba.

Kromě výpisu klasického textu a proměnných můžeme vypsat ještě některé speciální znaky, například odřádkování (enter), tabulátor (tab), uvozovky (quotes) nebo zpětné lomítko (backslash). K tomu používáme následující způsob:

printf("\n"); //výpis odřádkování (new line, enter)
printf("120 \t200"); //mezi číslicemi se vypíše tabulátor (tab)
printf("Říkali mi \"hrozný Láďa\"."); //oslovení bude nyní vypsáno v uvozovkách
printf("Pro odřádkování napište \\n."); //abychom mohli vypsat zpětné lomítko, musíme jej uvést dvakrát

Vstup

Pro vstup můžeme použít jednodušší, ale nebezpečnou funkci scanf(). Ta opět používá zástupný znak, jak jsme si ukazovali výše při výstupu. Hodnotu, kterou načte, se snaží uložit na adresu, která je uvedená za uvozovkami:

scanf("%d", &vek);

V tomto příkladu se načte celé číslo a uloží se na adresu proměnné vek.

Funkce má nevýhodu při načítání řetězce: zastaví se o první mezeru (resp. prázdný) znak. Takže například:

char jmeno[20];
scanf("%s", jmeno);

Tento příklad bude krásně fungovat, když uživatel zadá pouze Martin. Pokud ale zadá například Tomáš Slabý, obsahem proměnné jmeno bude pouze první slovo.

Zároveň je funkce scanf() nebezpečná – nehlídá totiž, jestli je celá paměť, do které bude zapisovat, správně alokovaná. V případě tedy, že by uživatel zadal jméno delší než 20 znaků, funkce je bez problému do paměti uloží, i když paměť může být používaná úplně k jiným účelům.

Proto při načítání textů raději používáme funkci fgets():

char celejmeno[64];
fgets(celejmeno, 64, stdin);

Zde vidíme, že do funkce fgets() zároveň posíláme i maximální počet znaků, tj. nemůže se stát, že by se zapsalo „mimo“ alokovanou paměť.