Toggle menu
Toggle preferences menu
Toggle personal menu
Neprihlásený/á
Your IP address will be publicly visible if you make any edits.

Výpis údajov na obrazovku terminálu v textovej podobe v jazyku C.


Výpis údajov

V ďalších témach budeme neustále niečo vypisovať na obrazovku nášho terminálu. V jazyku C na to slúži príkaz printf, dostupný v hlavičkovom súbore pre I/O (input/output) operácie (stdio.h).

S týmto príkazom sme sa stretli už v predošlej téme, kde sme na terminál vypísali jednoduchý pozdrav "ahoj":

#include <stdio.h>

int main() {
    printf("ahoj");
    return 0;
}

Predtým, ako si začneme vysvetľovať zložitejšie koncepty jazyka C, si musíme vysvetliť ako sa dá vôbec niečo vypísať na obrazovku.

Príkaz printf

Ako sme mali možnosť vidieť doteraz, na výpis priamo do terminálu slúži príkaz printf (f znamená "formatted" - formátovaný výstup). Existuje aj veľa ďalších príkazov pre vstup a výstup v terminály, no pre výstup sa najčastejšie používa printf (ako akceptovať v termináli vstup si vysvetlíme neskôr).

Terminál je v podstate iba rozhranie kde sa zadávajú príkazy, pričom výstupom je prúd znakov ktoré sa zobrazujú sekvenčne v textovej podobe. Takmer všetky programovacie jazyky dokážu komunikovať s terminálom - je to jeden z hlavných prvkov operačného systému, aj napriek tomu že bežný používateľ "neprogramátor" sa s ním možno nikdy nestretne. Prečo je terminál taký populárny? Samozrejme z toho dôvodu, že prvé operačné systémy mali veľmi jednoduché zobrazenie - ešte neexistovali farebné tlačítka a okná. Dokonca neexistovala ani myš. Počítač sa ovládal iba klávesnicou, a hlavným zobrazovacím prvkom bol práve terminál, ktorý akceptoval vstup výhradne prostredníctvom klávesnice a zobrazoval na obrazovku textový výstup. A keďže veľa programovacích jazykov má korene z čias kedy sa používal iba terminál, tak tento terminál zostal populárny dodnes. Načo odstraňovať niečo, na čom je postavená celá architektúra počítača a programovacích jazykov ako takých, že?

Ale k veci - každé volanie funkcie printf s argumentami vypíše na terminál formátovaný reťazec znakov, ktorý sa nachádza vo funkcii. Môžeme taktiež špecifikovať ktoré premenné sa majú nahradiť v pôvodnom reťazci a v akej podobe a tieto naformátované premenné vypísať.

Jednoduchý printf by mohol vyzerať nasledovne:

printf("ahoj\n");

Počas výpisu sa po terminály pohybuje pomyselný, neviditeľný kurzor ktorý do terminálu vpisuje znaky. Za každým vypísaným znakom sa posunie o jedno miesto doprava, kde sa vloží ďalší znak.

Existuje niekoľko špeciálnych znakov, ktoré dokážu týmto kurzorom pohybovať. Napríklad, na konci je znak \n, ktorý hovorí že kurzor sa má presunúť na nový riadok (na konci printf vždy dávame \n aby ďalší printf začínal na novom riadku, inak by sa všetko vypisovalo na jeden riadok).

Opačná lomka (\) vraví, že sa jedná o špeciálny znak, ktorých existuje hneď niekoľko:

Znak Čo robí? Príklad
\n Presunie kurzor na nový riadok (akoby sme stlačili na klávesnici "Enter") Funkcia: printf("ahoj\nsvet");
Vypíše:
ahoj
svet
\r Presunie kurzor na začiatok aktuálneho riadku (akoby sme išli na začiatok riadku a začali sme ho prepisovať odznovu). Funkcia: printf("123ahoj\rsvet");
Vypíše:
svet
\t Vloží tabulátor, pre odsadenie textu. Používa sa pre (viac-menej) konzistentné zarovnávanie textu. Funkcia: printf("ahoj\tsvet");
Vypíše:
ahoj	svet
\b Backspace - zmaže posledný znak a presunie kurzor o jedno miesto doľava. Funkcia: printf("ahoj\b");
Vypíše:
aho
\v Vertikálny tabulátor - presunie kurzor o jeden riadok dole bez toho, aby zmenil horizontálnu pozíciu (nie všetky terminály tento znak podporujú). Funkcia: printf("ahoj\vsvet");
Vypíše:
ahoj
    svet
\f Form feed - presunie kurzor na ďalšiu stranu. Bežne sa nepoužíva v termináloch.
\\, \', \" Vypíše spätnú lomku, apostrof alebo úvodzovky. Funkcia: printf("ahoj \\ \"svet\"");
Vypíše:
ahoj \ "svet"
\a Alarm - neviditeľný znak ktorý prehrá krátke pípnutie. Je to ešte z čias, kedy mechanické terminály (niečo ako písací stroj) obsahovali mechanický zvonček, ktorý upútal pozornosť v prípade, ak sa stalo niečo dôležité. V súčasnosti už nemá význam, tak ho mnohé terminály a operačné systémy jednoducho ignorujú a neprehrajú žiadny zvuk. Napr.: printf("\a"); by na niektorých systémoch prehralo krátke pípnutie.
\xhh Vloží znak podľa jeho hexadecimálnej pozície v ASCII tabuľke. Funkcia: printf("\x61\x68\x6F\x6A");
Vypíše:
ahoj
\ooo Vloží znak podľa oktálnej hodnoty (v osmičkovej sústave, podľa pozície v ASCII tabuľke).

Formátovanie premenných

Jednou z užitočných vlastností funkcie printf je možnosť formátovania premenných. Funguje to tak, že špecifikujeme formát, v akom by mali byť premenné vypísané a hodnoty týchto premenných sa v pôvodnom reťazci nahradia.

Napr.:

int cislo = 42;
printf("číslo je %d", cislo); // vypíše: číslo je 42

Ako môžeme vidieť, to čo má byť nahradené začína znakom percenta a za tým idú znaky, ktoré špecifikujú pôvodný typ premennej, resp. jej formát.

Ak chceme vypísať viacero hodnôt naraz, špecifikujeme viacero formátových identifikátorov. V ďalších argumentoch pre funkciu printf ich potom vymenujeme po rade, tak ako nasledujú v reťazci ktorý vypisujeme. Napr.:

int a = 42, b = 15;
printf("a = %d, b = %d", a, b); // vypíše: a = 42, b = 15

Poznáme niekoľko formátov:

Kód Určený pre Príklad
%d alebo %i Výpis celočíselných hodnôt printf("%d", 42); // 42

printf("%d", 42.9); // blbosť

%u Pozitívne celočíselné hodnoty (unsigned) printf("%u", 42); // 42

printf("%u", -12); // blbosť (číslo sa pretočí od najvyššej hodnoty)

%f Desatinné čísla s pohyblivou rádovou čiarkou (môžeme taktiež špecifikovať počet miest pre zaokrúhlenie). printf("%.2f", 3.14159); // 3.14
%c Znak (jeden). printf("%c", 'A'); // A

printf("%c", 42); // * (znak na 42 pozícií)

printf("%c", "BLABLA"); // � (blbosť)

%s Vypíše reťazec znakov (z poľa znakov). printf("%s", "ahoj"); // ahoj

...a samozrejme, mnoho ďalších - ale toto sú tie najpoužívanejšie.

Ďalšie formátovacie modifikátory

Šírka a presnosť:

  • %5d → Minimálna šírka 5, napr.: printf("%5d", 42);„ 42“
  • %.2f → 2 desatinné miesta, napr.: printf("%.2f", 3.14159);3.14
  • %8.3f → Šírka 8 a na 3 desatinné miesta, napr.: printf("%8.3f", 3.14159);„ 3.142“

Vlajky:

  • %- → Zarovnanie doľava, napr.: %-5d
  • + → Vždy zobraziť znak, napr.: printf("%+d", 42);+42
  • 0 → Doplnenie núl na prázdne miesto, napr.: printf("%05d", 42);00042