Výstup
Stejně jako pro načítání vstupu, i pro výpis textu na výstup nabízí standardní knihovna C sadu
užitečných funkcí, opět umístěných v souboru <stdio.h>. Stejně jako u načítání vstupu
bychom i u výstupu měli řešit ošetření chyb. Nicméně, u zápisu to
(alespoň u malých programů) není až tak nezbytné, protože chyby zápisu jsou vzácnější než chyby při
vstupu. Zdrojem dat je totiž náš program, a nemusíme tedy tak striktně kontrolovat, jestli jsou
vypsaná data validní. Tato povinnost v jistém smyslu přechází na druhou stranu, s kterou náš program
komunikuje, protože ta bude námi vypsaná data číst.
Vypsání znaku
Pro vypsání jednoho znaku na standardní výstup (stdout) můžeme použít funkci
putchar.
#include <stdio.h>
int main() {
putchar('x');
return 0;
}
Vypsání řetězce
Pro vypsání celého řetězce na stdout můžete použít funkci puts,
která zároveň za řetězcem vypíše znak odřádkování \n:
#include <stdio.h>
int main() {
puts("Ahoj");
puts("UPR");
return 0;
}
Dávejte si pozor na to, že v předaném řetězci musí být obsažen ukončovací NUL znak! Funkce puts
se bude snažit číst a vypisovat znaky ze zadané adresy, až dokud na takovýto znak nenarazí. Pokud
by tento znak v předaném řetězci nebyl, tak se bude funkce pokoušet číst nevalidní paměť za koncem
řetězce, dokud na NUL nenarazí, což by vedlo k
paměťové chybě 💣.
Vypsání formátovaného textu
K výpisu formátovaného textu na stdout můžeme použít funkci printf, s kterou jsme se již
mnohokrát setkali. Prvním parametrem funkce je formátovací řetězec, do kterého můžete dávat
zástupné znaky začínající procentem (např. %d nebo %s). Pro každý takovýto zástupný znak funkce bude očekávat jednu
hodnotu (argument) za formátovacím řetězcem, která bude zformátována na výstup. Například takto můžeme vytisknout číslo
a po něm řetězec:
const char* text = "Cislo";
int cislo = 5;
printf("Cislo %d, retezec %s: \n", cislo, text);
Jelikož jsme ve formátovacím řetězci předali dva zástupné znaky (%d - číslo a %s - řetězec), tak po řetězci musíme
do funkce printf předat jeden argument číselného typu, a poté jeden řetězec.
Zástupné znaky funkcí printf i scanf jsou obdobné, jejich seznam a různé možnosti nastavení
můžete najít v dokumentaci. Nejčastěji budeme používat tyto zástupné znaky:
%d- výpis celého čísla se znaménkem, nejčastěji datový typint%f- výpis desetinného čísla, datový typfloat%s- výpis řetězce, datový typchar*(ukazatel na znak)- Na předané adrese musí ležet řetězec, tj. pole znaků ukončené znakem
'\0'!
- Na předané adrese musí ležet řetězec, tj. pole znaků ukončené znakem
Stejně jako
scanfmá i funkceprintfrůzné varianty pro formátovaný výpis do souborů (fprintf) či do řetězce v paměti (sprintf).
Kvíz 🤔
-
Co vypíše následující program?
#include <stdio.h> int main() { int a = 1; printf("Hodnota: %f", a); return 0; }Odpověď
Tento program obsahuje nedefinované chování 💣. Říkáme funkci
printf, že chceme vypsat desetinné číslo (zástupný znak%f), ale jako argument předáváme výraz typu celé číslo (int). Tento program tedy není validní. -
Co vypíše následující program?
#include <stdio.h> int main() { int a = 1; printf("Hodnota: %d (a=%d)", a); return 0; }Odpověď
Tento program obsahuje nedefinované chování 💣. Říkáme funkci
printf, že jí předáme dvě hodnoty (dva výrazy) typu celého čísla (zástupný znak%d), ale předáváme pouze jednu hodnotu (a). Tento program tedy není validní. -
Co vypíše následující program?
#include <stdio.h> int main() { int a = 1; printf("Hodnota: %s", a); return 0; }Odpověď
Tento program obsahuje nedefinované chování 💣. Říkáme funkci
printf, že jí předáme hodnotu typu řetězec (zástupný znak%s), ale předáváme pouze hodnotu typu celé číslo (int). Tento program tedy není validní.