Programowanie

printf

printf

W językach programowania printf jest rodziną funkcji służących do tworzenia i zapisywania tekstu na podstawie szablonu i zestawu argumentów, które są w ten szablon wstawiane.

Funkcje grupy printf zostały stworzone na potrzeby języka C. Obecnie są dostępne również dla wielu innych języków programowania.

Spis treści

[edytuj] Rodzina funkcji printf w C

Wikibooks
Zobacz podręcznik na Wikibooks: Programowanie:C - printf

W C występuje wiele funkcji grupy printf. Różnią się one jedynie sposobem przekazywania argumentów, znaczeniem kodu zwrotnego (który w zwykłym printfie zwykle jest pomijany) i tym, co robi się z wygenerowanym tekstem.

Funkcje, które pojawiły się we wczesnych Uniksach:

W BSD 2.11 pojawiły się wersje dla argumentów przekazywanych przez stdarg:

W BSD 4.4 pojawiÅ‚a siÄ™ funkcja :

W FreeBSD i GNU libc są obecne też (niestandardowe)

które same alokują pamięć pod tekst. Jest to najbezpieczniejsza funkcja printf pisząca do pamięci, jednak nie jest standardowa i może być trochę wolniejsza.

W GNU libc dodatkowo są też obecne:

piszÄ…ce do deskryptora zamiast do strumienia.

Istnieją też odpowiedniki dla szerokich znaków:

[edytuj] Printf w innych językach

W wielu innych językach występują funkcje printf i sprintf (która wbrew nazwie prawie wszędzie sama alokuje pamięć).

Przykłady:

[edytuj] Printf w Uniksie

Systemy uniksowe mają zaimplementowaną funkcję printf jako narzędzie konsolowe.

[edytuj] Przykład

$ printf "%d+%d=%d\n"  "2" "2" "2+2"

[edytuj] Składnia szablonów

Szablon to zwykły tekst zawierający pola do uzupełniania. Pole zaczyna się od znaku %, potem mogą wystąpić modyfikatory, a na koniec pojedynczy znak typu pola. Znak % pisze się %%.

Należy zauważyć że znaki specjalne postaci \X nie mają nic wspólnego z printfem i są obsługiwane przez kompilator C w czasie kompilacji lub interpreter w przypadku niektórych innych języków.

Zestaw dozwolonych pól jest różny zależnie od języka i standardu. Krótki przegląd częściej stosowanych pól:

Niektóre pola z modyfikatorami:

[edytuj] Kwestie bezpieczeństwa

Z użyciem funkcji z rodziny printf wiążą się dwie podstawowe grupy zagrożeń bezpieczeństwa:

Dodatkowo, pewne scenariusze ataków mogą pojawiać się, gdy dochodzi do niezgodności między budową szablonu a faktycznymi parametrami przekazanymi funkcji *printf - na przykład gdy parametrów jest mniej niż pól w szablonie, albo wartości liczbowe przekazywane są w miejsce wskaźników. Błędy tego typu zwykle prowadzą jednak do nieprawidłowego działania programu i zostają wykryte przez programistę szybciej, niż dwie wymienione wyżej klasy.

[edytuj] Argumenty za i przeciw funkcjom grupy printf oraz funkcjom na nich wzorowanych

Większość nowych języków udostępnia funkcje typu printf, choć zwykle dostępne są też inne mechanizmy, np. w Perlu można wpisywać bezpośrednio w łańcuch tekstowy nazwy zmiennych - np. $x=2;$y=2;$z=2+2; print "$x+$y=$z", a w Ruby nawet całe wyrażenia - print "#{2}+#{2}=#{2+2}\n".

W platformie .NET istnieje podobna funkcja String.Format("{0}+{1}={2}\n", 2, 2, 2 + 2), która dodatkowo umożliwia łatwą zmianę kolejności użycia argumentów.

Niektóre języki, np. Ada, celowo nie posiadają funkcji tego typu. Są one tu praktycznie niemożliwe do implementacji ze względu na zbyt silną kontrolę systemu typów.

Argumenty za:

Przeciw: