Funkcije

Izpisovanje

V tem poglavju si bomo pogledali uporabo funkcije printf iz sistemske knjižnice stdio.h (standard input and output), ki se ga uporablja za oblikovano izpisovanje – formatted output.

Izpis spremenljivk

Sedaj, ko poznamo nekaj tipov spremenljivk in jim znamo nastaviti vrednosti, bi se radi na lastne oči prepričali, ali vse dosedaj našteto drži, zato potrebujemo način izpisa. Oglejmo si enostaven program, kjer nastavimo vrednost spremenljivke a na 2 in jo izpišemo. Ko se je program prevedel, bi ob njegovi izvršitvi morali zagledati a = 2.

#include <stdio.h>

int main()
{
  int a = 2;
  printf("a = %i\n", a);
   
  return 0;
}

Da bi razumeli, kako deluje izpis, si poglejmo drugi stavek v funkciji main podrobneje.

Funkcija printf je v knjižnici predstavljena kot int printf(const char *format, ...);, kar pomeni, da zahteva vsaj en parameter, pri čemer mora biti prvi parameter tipa const char *, kar pomeni kazalec na spremenljivko tipa const char, oziroma kaže na niz znakov. Ta niz določa obliko izpisa. Vsi nadaljni, dodatni parametri (drugi, tretji, …) funkcije so poljubnega tipa in največkrat spremenljivke, ki jih želimo izpisati.

Niz oblike izpisa niti pod razno ne sme biti spremenljivka!

Oblika izpisa

Kot že omenjeno je oblika izpisa niz znakov, ki poleg besedila vsebuje oblikovna zaporedja znakov (conversion specifications), ki se začno z % in povedo, kako naj se dodatni parametri, podani za nizom načina zapisa, izpišejo. Vsi znaki v nizu oblike izpisa, ki ne pripadajo oblikovnim zaporedjem, se izpišejo nespremenjeno. Če bi radi izpisali znak za odstotek, ga moramo v obliki izpisa zapisati kot %%.

V zgornjem primeru je oblika izpisa enaka "a = %i\n". Ker vsi znaki pred % (znakom za odstotek) ne pripadajo oblikovnim zaporedjem, se ti izpišejo. Naslednji znak je znak za odstotek, ki naznani obliko izpisa prvega dodatnega parametra podanega funkciji printf. Ta dodatni parameter je a. Za znakom za odstotek je i, ki pove, da se bo izpisalo predznačeno celo število. Za konec \n poskrbi za prehod v novo vrstico, s čimer dosežemo sprostitev medpomnilnika za izpis.

Če v programu spremenimo prvo vrstico v int i = -6;, potem bi moralo izpisati i = -6.

Oblikovno zaporedje

Oblikovno zaporedje ima obliko %[parameter][flags][width][.precision][length]type. Polja v oglatih oklepajih niso zahtevana (so izbirna).

Polje parameter

Polje parameter je izbirno in podprto v POSIX razširitvah. Z uporabo tega polja se sklicujemo na zaporedno številko dodatnega parametra, ki smo ga podali funkciji printf. Za zaporedno številko je potrebno zapisati znak $.

Polje flags

Tudi polje flags je izbirno, katerega vsebina je sestavljena iz naslednjih znakov: #, 0,   (presledek), + in -, ki jih lahko smiselno uporabljamo tudi več hkrati in v poljubnem vrstnem redu.

int i = 4;
int j = -5;
printf("%+i + %+i = %+i\n", i, j, i + j); /* +4 + -5 = -1 */

Polje width

S poljem width se (izbirno) predpiše najmanjše število znakov za izpis. Če izpis porabi manj znakov, potem se primanjkljaj zapolni s presledki z leve oziroma z desne, če je določena poravnava na levo. Če se namesto števila uporabi znak *, se najmanjše število znakov za izpis prebere iz spremenljivke. Mogoče je uporabiti tudi *m$, da se vrednost prebere iz m-tega dodatnega parametra, ki mora biti tipa int.

int i = 40;
int j = -370;

/* Vrednosti bo desno poravnalo. */
printf("%5i\n", i);  /*    40 */
printf("%5i\n", j);  /*  -370 */

Polje precision

Polje precision določi natančnost oziroma zgornjo mejo. Polje se naznani z uporabo . (pike). Mogoče je uporabiti tudi način .*m$, da se vrednost prebere iz m-tega dodatnega parametra tipa int.

Največkrat se polje uporabi pri izpisu vrednosti spremenljivk s plavajočo vejico, s čimer se predpiše število števk desno od decimalne vejice. Pri tem se vrednost zaokroži. Pri izpisu celih števil si z uporabo tega polja zagotovimo izpis vodilnih ničel, medtem ko se izpis niza znakov pri meji zgolj odreže.

float u = 4.3555;
float v = 7.9121;
printf("%.2f + %.2f = %.6f\n", u, v, u + v); /* 4.36 + 7.91 = 12.267600 */

Polje length

Polje length je izbirno in je odvisno od tipa spremenljivke, katero želimo izpisati.

Polje type

Polje type je obvezno in z njim določimo končno obliko izpisa.