7. Printf i wyświetlanie danych
W poprzednim punkcie napisaliśmy program wyświetlający na ekranie tekst. Dla przypomnienia – skorzystaliśmy z funkcji „printf”. Jednak co to za program, który wyświetla z góry ustalone teksty i nie ma możliwości zaprezentowania wyników przeprowadzonych operacji ? W tym właśnie punkcie zaprzęgniemy wspomnianą funkcję do takiej właśnie pracy. Jak zwykle posłużymy się przykładowym programem.
#include <stdio.h>
void main(void)
{
float f = 0.521;
int i = -123;
unsigned int u = 24;
char c = ´A´;
printf(„Zmienna f = %f, natomiast zmienna i jest rowna %d.
„, f, i);
printf(„Zmienna c = %c, a zmienna u jest rowna %u.
„, c, u);
printf(„Zmienna u w zapisie szestnastkowym jest rowna %x,
„, u);
printf(„natomiast w zapisie osemkowym jest rowna %o.”, u);
}
Jak widzimy funkcja „printf” może także wyświetlać wartości zmiennych. Ogólny jej zapis wygląda tak:
printf(ciag_formatujący, lista parametrów);
Ciąg formatujący jest zwykłym ciągiem znaków do wyświetlenia na ekranie. Jednak niektóre znaki mają funkcję specjalną i nie zostaną one po prostu wyświetlone. Takim właśnie znakiem jest znak % . Gdy funkcja printf go napotka to wie, że po nim wystąpi określenie rodzaju argumentu i formatu jego wyświetlenia na ekranie. Ogólnie wygląda to tak:
% [flagi] [szerokość] [precyzja] [modyfiktor wielkości] typ_parametru
Tylko „typ_parametru” musi wystąpić po znaku % , natomiast parametry podane w nawiasach kwadratowym są opcjonalne i może ich w ogóle nie być (tak jest w przedstawionym przykładzie). Poniżej podałem najczęściej stosowane typy parametrów:
%d
zmienna typu int (ze znakiem)
%u
zmienna typu int (bez znaku)
%c
zmienna typu char (litera)
%f
zmienna typu float (rzeczywista)
%x
zmienna typu int (bez znaku) wyświetlana w postaci szesnastkowej
%o
zmienna typu int (bez znaku) wyświetlana w postaci ósemkowej
%s
ciąg znaków (zostanie omówiony później)
%p
wskaźnik (zostanie omówiony później)
Nie przerażaj się jeszcze, po przeanalizowaniu zasady działania funkcji printf wszystko stanie się jasne. Zrobimy to na podstawie pierwszej linijki z tą funkcją w naszym programie, czyli:
printf(„Zmienna f = %f, natomiast zmienna i jest rowna %d.
„, f, i);
Po wywołaniu funkcja printf sprawdza znak po znaku ciąg formatujący. Ciąg ten rozpoczyna się od „Zmienna f = „. Ponieważ na razie nie wystąpił znak % wszystkie te znaki zostaną po prostu wyświetlone na ekranie. Następnie napotyka się na znak % , którego jednak już nie wyświetla, ale sprawdza co stoi za nim. Okazuje się, że jest to literka „f”, czyli razem otrzymuje %f , która to kombinacja oznacza, że w tym miejscu powinna wyświetlić liczbę typu rzeczywistego (patrz tabelka powyżej). Bierze więc pierwszy argument (który jest wypisany po przecinku zaraz za znakiem cudzysłowia kończącego ciąg formatujący), którym w naszym przypadku jest zmienna f i wyświetla jego wartość na ekranie. Następnie przechodzi do dalszego sprawdzania ciągu formatującego. Wyświetla ciąg „, natomiast zmienna i jest rowna „, ponieważ także nie występuje w nim żaden znak kontrolny i dochodzi do miejsca, w którym mamy drugi znak % . Tym razem typem parametru jest „d”, czyli jest to informacja, że ma wyświetlić liczbę całkowitą (ze znakiem). Tak więc funkcja printf pobiera drugi argument, którym w naszym przypadku jest zmienna i, a następnie wyświetla jej zawartość na ekranie. Po tym, jak już to zrobi wraca do sprawdzania ciągu. Tym razem natyka się na „.”, którą to wyświetla i pobiera następny znak, którym jest . Jest to drugi, po % , znak kontrolny. Ciąg
daje informację dla printf , że w tym miejscu powinna ona przejść do następnej linii ekranu. Innymi często używanymi są:
tabulacja
powrót karetki (kursor przesuwa się do początku linii)
backspace (cofnięcie o jeden znak)
a
bell (krótki sygnał dźwiękowy)
„
znak cudzysłowia (zauważ, że jakbyś po prostu go wpisał to kompilator potraktowałby to jako zakończenie ciągu formatującego)
Czyli w efekcie, po wykonaniu tej funkcji na ekranie pojawi się:
„Zmienna f = 0.521000, natomiast zmienna i jest rowna -123.”
Jak widzimy, wartość zmiennej f jest wyświetlona z dokładnością do sześciu miejsc po przecinku. Jednak nas mogą interesować na przykład jedynie dwa miejsca po przecinku, reszty nie potrzebujemy. Wtedy należy użyć opcjonalnych parametrów, które mogą wystąpić po znaku % . Dla przypomnienia ogólny zapis wygląda tak:
% [flagi] [szerokość] [precyzja] [modyfiktor wielkości] typ_parametru
Zaczniemy od omówienia flag:
–
wyrównuje liczbę do lewej (normalnie byłaby wyrównana do prawej)
+
liczba zawsze zaczyna się od znaku „+” (dla dodatnich) lub „-” (dla ujemnych), normalnie znak jest wyświetlany tylko dla liczb ujemnych
Teraz parametr szerokość:
n
gdzie n jest liczbą określającą ile znaków zostanie wyświetlonych. Jeśli n jest większe od szerokości liczby to zostanie ona uzupełniona spacjami. Jeśli jest mniejsze to liczba nie zostanie ucięta.
0n
gdzie n jest liczbą określającą ile znaków zostanie wyświetlonych. Jeśli n jest większe od szerokości liczby to zostanie ona uzupełniona zerami. Jeśli jest mniejsze to liczba nie zostanie ucięta.
Teraz parametr precyzja:
Parametr ten zawsze zaczyna się od kropki, a następnie podajemy ilość liczb do wyświetlenia po przecinku (tak jak to było przy szerokości.
Pozostał jeszcze jeden parametr, a mianowicie modyfikator wielkości:
l
określa, że parametr jest typu long (np. long int to %ld)
h
określa, że parametr jest typu short (np. short int to %hd)
Wszystko zostało już omówione, na zakończenie podam jeszcze przykłady użycia. Wszystkie będą pokazywały to, co zostanie wyświetlone na ekranie, przy założeniu, że zmienne mają wartości takie jak w naszym przykładowym programie.
„[%6.3f]”
wyświetli się „[ 0.521]”. Pamiętaj, że liczba sześć oznacza szerokość całej liczby, a nie tylko części przed przecinkiem. Ponieważ szerokość liczby jest równa pięć, to została dodana jedna spacja _przed_ liczbą.
„[%-6.3f]”
wyświetli się „[0.521 ]”. Jak wyżej, tylko spacja została dodana _po_ liczbie (wyrównanie do lewej).
„[%06.3f]”
wyświetli się „[00.521]”. Czyli zamiast spacji, zostało dodane zero.
„[%+6.3f]”
wyświetli się „[+0.521]”. Oczywiście dla f równego -0.521 wyświetli się znak minus, nie plus.