Naukę programowania języka C rozpoczniemy od jednej z najbardziej podstawowych funkcji, jaką poznaje każdy człowiek rozpoczynający naukę tego języka 📖. Mam tu na myśli "printf", które w języku C jest nader często wykorzystywane w programach 🧨. Zapraszam do postawienia pierwszego wywołania w Twoim programie, które wypisze Ci tekst w konsoli 😄.
"PRINTF" W JĘZYKU C TO PIERWSZA INSTRUKCJA, OD KTÓREJ (PRAWDOPODOBNIE) ZACZNIESZ PISANIE PROGRAMÓW
Nie ma cienia przesady w stwierdzeniu, że patrzymy teraz na funkcję należącą do najbardziej podstawowego zestawu 🔧. Przyjrzyjmy się samej definicji, w której znajdziesz od razu zastosowanie tejże funkcji 🙂!
DEFINICJA
"printf" (skrót od "print formatted") służy do wypisywania uprzednio sformatowanego łańcucha znaków na ekranie konsoli. Aczkolwiek to nie jest w pełni poprawna definicja 😳.
Ujmując rzecz jeszcze bardziej technicznie, funkcja zajmuje się formatowaniem i konwersją danych wejściowych (np. liczb) na łańcuch znaków i przekierowaniem wyniku na strumień wyjściowy o nazwie "stdout" (ang. standard output). To oznacza, że "punktem docelowym" wcale nie musi być wiersz poleceń. To może być też np. plik 📁!
Piszę o tym, żeby Ci uświadomić, że możesz zmieniać miejsce, w którym wynik działania funkcji "printf" w języku C zostanie "naniesiony" ✅. W jaki sposób się to robi, zostawimy sobie na odrębny artykuł.
PRZYKŁAD KODU ŹRÓDŁOWEGO
Teraz pokażę Ci funkcję "main", w której znajduje się parę wywołań funkcji "printf". Zostawiłem też komentarze, aby pomóc Ci zrozumieć co się dzieje "wysokopoziomowo" 👇:
#include <stdio.h>
int main(void)
{
printf("Tekst\n"); // wypisywanie łańcucha znaków w najbardziej podstawowej formie
printf("%d + %d = %d\n", 2, 2, 2 + 2); // wypisywanie dwóch argumentów (cyfry 2) i wyniku dodawania ich do siebie (4)
printf("[%-25s]\n", "Tekst"); // wypisywanie łańcucha znaków w miejsce o długości 25 znaków z wyrównaniem do lewej strony
printf("Liczba: %.1f\n", 6.1553f); // wypisywanie liczby zmiennoprzecinkowej (z ułamkiem) z zaokrągleniem do jednego miejsca po przecinku
return 0;
}U góry znajduje się dyrektywa "stdio.h", dzięki której możemy odwołać się do funkcji "printf" w języku C. Ona z kolei przyjmuje dwa parametry przy czym to nie jest prawda (jest to jedna z funkcji o zmiennej liczbie parametrów), lecz na razie tak załóżmy 👇:
- łańcuch znaków opatrzony "specyfikatorami" (opisuję dalej o co chodzi),
- wartości dowolnych typów danych zgodnych ze specyfikatorami.
Zauważ, że wypisywanie podanego łańcucha znaków to nie jest jedyna rzecz, do której jest zdolna ta funkcja 🔥!
W tym miejscu odsłania się powód występowania w definicji słowa "formatowanie" 😇. Zanim wynik zostanie przekazany do strumienia wyjściowego (ucz się już teraz poprawnego określenia 😉), zostaje poddany odpowiedniemu formatowaniu, a ono z kolei jest uzależnione od specjalnych oznaczeń, zwanych fachowo "specyfikatorami" ℹ️.
ZNACZENIE SPECYFIKATORA
Specyfikator to symbol wstawiany wewnątrz łańcucha znaków, który oznacza dla funkcji "gniazdo" (miejsce) na argument np. liczbę całkowitą czy znak, który jest przekazywany w kolejnych parametrach wywołania. Rozpoznasz go po charakterystycznym ciągu rozpoczynającym się od znaku procent (%) ⚠️.
Podczas przetwarzania danych przez funkcję "printf", specyfikatory są zamieniane na wskazane argumenty i odpowiednio konwertowane. Na przykład "%d" oznacza miejsce do wstawienia liczby całkowitej - literka 'd' od "decimal", czyli liczby (dziesiętne) 🔢. To z uwagi na liczby całkowite, ten specyfikator został użyty. W efekcie końcowym, ten zapis 👇:
printf("%d + %d = %d\n", 2, 2, 2 + 2);zostanie przetworzony na następujący tekst:
2 + 2 = 4Podane "dwójki" są po prostu "podstawiane" pod specyfikatory i tak uzyskujemy ciąg wyrażenia arytmetycznego ✔️.
Idąc dalej (trzecie wywołanie), natrafiamy na jeszcze inny specyfikator:
"%-25s"Tym razem mamy liczbę ujemną 🤯! Tutaj mamy do czynienia z formatowaniem dla łańcucha (rozpoznasz to po literce 's', czyli "string"). To oznacza zdefiniowanie "miejsca" dla łańcucha o długości co najmniej 25 znaków. Wbrew temu, co możesz wnioskować "z automatu", tutaj znak ujemny oznacza wyrównanie łańcucha do lewej strony. Zatem, w końcowej fazie przetwarzania, uzyskamy taki ciąg:
[Tekst ]W sytuacji, gdy podany łańcuch przekroczy wskazaną liczbę znaków, to wtedy miejsce zostanie "wydłużone" ⚠️!
Ostatni przykład dotyczy określenia ile miejsc po przecinku ma mieć liczba jaka ma zostać przekazana strumieniowi "stdout". Tu jest jeszcze inna literka, 'f':
"%.1f"od "floating-point" - liczba zmiennoprzecinkowa 🙃. "Jedynka" poskutkuje ustawieniem tylko jednej liczby po przecinku 1️⃣. Co ważne, wynik zostanie zaokrąglony, a nie obcięty!
Liczba: 6.2W programowaniu (już przyjętym ogólnie, bo to nie dotyczy tylko języka C), znakiem oddzielającym część całkowitą od ułamkowej jest kropka!
Jeszcze jedna uwaga! Ponieważ są to "zaplombowane" postacie specyfikatorów, są przez to "czułe" na literówki. Jeżeli zauważysz, że coś nie wygląda tak, jak powinno, upewnij się, że dobrze wprowadziłeś(-aś) specyfikator ⚠️.
I ostatnia rzecz na koniec. Te "końcówki" w każdym łańcuchu 👇:
"\n"są wpisane nie bez kozery 🙂. To jest tzw. "znak ucieczki" (ang. escape character), który wykonuje przejście do następnego wiersza, dokładnie tak samo jak naciskasz klawisz Enter w dowolnym edytorze tekstu 💡. Bez niego, wszystkie wyniki znalazłyby się obok siebie w jednym wierszu ⚠️!
LISTA SPECYFIKATORÓW FORMATU FUNKCJI
Poniżej zostawiłem tabelę wszystkich specyfikatorów formatu "printf" w języku C, które możesz spotkać podczas przeglądania kodów źródłowych 👇:
| SPECYFIKATOR | ZNACZENIE |
| %hd | liczba całkowita w systemie dziesiętnym ze znakiem (signed short int) |
| %hu | liczba całkowita w systemie dziesiętnym bez znaku (unsigned short int) |
| %d / %i | liczba całkowita w systemie dziesiętnym ze znakiem (signed int) |
| %u | liczba całkowita w systemie dziesiętnym bez znaku (unsigned int) |
| %ld | liczba całkowita w systemie dziesiętnym ze znakiem (signed long int) |
| %lu | liczba całkowita w systemie dziesiętnym bez znaku (unsigned long int) |
| %lld | liczba całkowita w systemie dziesiętnym ze znakiem (signed long long int) |
| %llu | liczba całkowita w systemie dziesiętnym bez znaku (unsigned long long int) |
| %o | liczba całkowita w systemie oktalnym (ósemkowym) |
| %x / %X | liczba całkowita w systemie heksadecymalnym (szesnastkowym) |
| %f | liczba zmiennoprzecinkowa w systemie dziesiętnym (float / double) |
| %e / %E | liczba zmiennoprzecinkowa w notacji naukowej |
| %c | pojedynczy znak |
| %s | łańcuch znaków |
| %p | wskaźnik jako adres (*) |
| %% | znak procent |
Nie próbuj się tego uczyć na pamięć ⛔. To nie jest po to, żeby Cię jakkolwiek przerazić ile tego jest 😅, tylko abyś mógł/mogła się z tym pobieżnie zapoznać, przyjrzeć się i podczas ćwiczeń, wrócić sobie do tego wpisu i użyć któregoś z tych specyfikatorów w praktyce 👍. Tak będzie dużo lepiej 😊.
![]() |
Funkcja "printf" w języku C umożliwia konwertowanie danych wejściowych na łańcuch znaków wypisywany w strumieniu wyjściowym "stdout".
Właśnie zapoznałeś(-aś) się z funkcją "printf" w języku C, brawo 🥳! Mamy pierwszy krok za sobą 😁!
