FULL-C: printf

Verze z 26. 6. 2021, 12:35, kterou vytvořil Adamn (diskuse | příspěvky) (Založena nová stránka s textem „ Tato stránka popisuje programovací jazyk '''FULL-C''', který je dostupný na vybraných zařízeních SDS. Některá zařízení používají SDS-C,…“)
(rozdíl) ← Starší verze | zobrazit aktuální verzi (rozdíl) | Novější verze → (rozdíl)
Tato stránka popisuje programovací jazyk FULL-C, který je dostupný na vybraných zařízeních SDS. 
Některá zařízení používají SDS-C, pro který máme návody jinde na této WiKi.

Standard

FULL-C plně sleduje standard jazyka C, i se všemi specifiky.

  • Tisk a převody signed / unsigned

Na toto si dejte pozor, už to bylo zdrojem mnohých nečekaných problémů.

Nejčastější chybou je tisk číselné hodnoty proměnné definované jako char.

Typy "char", "int" jsou dle C standardu "signed char", "signed int" atd. (pokud jej explicitně nedefinujete jako unsigned).

To přináší "problém" při použití (s)(n)printf funkcí (atd.), kdy se použije %u nebo %x pro tisk číselné hodnoty (tedy ne např. %c), ale interně se to uvnitř (s)(n)printf převede na int32 a pak až tiskne. Lze si částečně pomoct pomocí %hu ale to nestačí. Řešením je přetypování.

Příklad:

 char c1, c2;
 c1 = 10; c2 = 200;
 printf("%u %u", c1, c2);
<pre>
Co by jste čekali že uvidíte ? Podle C standardu uvidíte toto: "10 -56" (bez uvozovek).

Správně totiž musíte program zapsat takto:
<pre>
 char c1, c2;
 c1 = 10; c2 = 200;
 printf("%u %u", (unsigned char)c1, (unsigned char)c2);
<pre>


== int printf(char *format, ...); ==

Provede vypsání parametrů (...) do konzole (echo.html) v závislosti na formátování (format).

Příklad:
<pre>
 void main(void)
 {
   int i;

   i = 1 + 1;

   printf(" 1 + 1 = %d \n", i);

   for (;;); // wait here forever

 }

Příklad:

 void main(void)
 {
   char txt[6];

   txt[0] = 'h';
   txt[1] = 'e';
   txt[2] = 'l';
   txt[3] = 'l';
   txt[4] = 'o';
   txt[5] = 0;

   printf(" %s world \n", txt);

   for (;;);  // wait here forever

 }


Formátování

Platí, že všechny formátovací prvky jsou uvedeny pomocí znaku procenta '%' s následnou informací o typu parametru.

%specifier = popis

%%         = vypíše znak %
%d, %i     = signed decimal integer
%o         = unsigned octal
%u         = unsigned decimal integer
%x         = unsigned hexadecimal integer
%X         = unsigned hexadecimal integer (uppercase)
%e, %E     = nepodporováno
%g, %G     = nepodporováno
%a, %A     = nepodporováno
%f         = decimal floating point number
%F         = decimal floating point number (uppercase)
%c         = jeden znak
%s         = nulou ukončený text
%p         = pointer address
%n         = nepodporováno
%m         = nepodporováno

Samozřejmě, použití formátovacích prvků musí přesně odpovídat parametrům (...) poskytnutým příslušnému volání printf().

Formátování lze dále zpřesňovat - pomocí doplňujících parametrů v rámci každého formátovacího prvku:

%[flags][width][.precision][length]specifier 


Příklad:

 int i;
 unsigned int l, z;
 char *q;

 printf("%d %u %x %s \n", i, (unsigned int)l, (unsigned int)z, q);

 printf("Zarovnani nulami zleva na deset mist: %010d \n", 1984);


Souvislosti

Stejný způsob formátování používá i FULL-C funkce sprinf() a snprintf(), popř. sscanf().

Výpis do konzole (echo.html) je additivní, tzn. každé volání printf() tam text přidá (k textu, který tam už předtím byl). Pokud je potřeba obsah konzole smazat, použije se FULL-C funkce echoclear().