Elektronika - baza wiedzy

Cześć 7 kursu C/C++


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.