Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?
Opracował: Piotr DejaVu Szawdyński
Pomogli: pekfos, GoldWolf
Język C++

tekst sformatowany - printf

[specyfikacja] Specyfikacja tekstu sformatowanego dla funkcji printf.

Podstawowe informacje

Niniejszy dokument opisuje reguły umożliwiające tworzenie tekstu sformatowanego dla funkcji » standard Cprintf.

Tekst sformatowany jest to łańcuch znaków w którym umieszcza się tagi o określonej konstrukcji w celu wypisania wartości zmiennych lub stałych. Zaformatowany łańcuch znaków trafia na standardowe wyjście (» standard Cstdout) lub do pliku bądź do zmiennej będącej łańcuchem znaków. Miejsce docelowe jest zależne od funkcji jaka zostanie zastosowana. W przypadku funkcji » standard Cprintf jest to standardowe wyjście (» standard Cstdout).

Każdy tag rozpoczyna się znakiem % co oznacza, że znak % jest znakiem specjalnym. Aby wypisać znak % w tekście sformatowanym należy napisać go dwukrotnie. W wyniku wykonania następującego wiersza:
printf( "%%" );
 program wyświetli na standardowym wyjściu znak
%
.

Budowa tagu formatującego

Ogólna budowa tagu formatującego jest następująca:
%[flagi][szerokość][.precyzja][rozmiar]specyfikator_typu
Parametry występujące w nawiasach kwadratowych są opcjonalne - uszczegóławiają one sposób interpretacji specyfikatora typu.

Specyfikator typu jest parametrem wymaganym. Pozostałe parametry są opcjonalne. Specyfikator typu określa typ wyświetlanych danych oraz sposób jego reprezentacji.

Specyfikatory typów

specyfikatortyp argumentuPrzykładowe standardowe wyjście
d lub iLiczba całkowita ze znakiem (wynik w systemie dziesiętnym).1283
uLiczba całkowita bez znaku (wynik w systemie dziesiętnym).9474
oLiczba w systemie oktalnym (ósemkowym).623
xLiczba heksadecymalna (szesnastkowa). Występują małe litery.5f2
XLiczba heksadecymalna (szesnastkowa). Występują duże litery.5F2
fLiczba rzeczywista (wynik w systemie dziesiętnym).2.435
eLiczba w notacji naukowej (ze znakiem e).3.254e+2
ELiczba w notacji naukowej (ze znakiem E).3.254E+2
gLiczba rzeczywista w notacji %e bądź %f. Notacja naukowa jest używana tylko wtedy gdy wykładnik jest mniejszy od -4 lub gdy wykładnik jest większy albo równy od parametru precyzja.2.435
GLiczba rzeczywista w notacji %E bądź %f. Notacja naukowa jest używana tylko wtedy gdy wykładnik jest mniejszy od -4 lub gdy wykładnik jest większy albo równy od parametru precyzja.2.435
cZnak.h
sŁańcuch znaków zakończony znakiem terminalnym '\0'.cos
pAdres w pamięci.B800:0000

Flagi

flagaopis
-Wyrównaj wypisywane dane do lewej. Pozycja jest ustalana na podstawie parametru szerokość oraz na podstawie długości tekstu wyjściowego. Domyślnie tekst jest wyrównywany do prawej.
+Poprzedza wynik znakiem + lub - jeżeli wartość wyjściowa jest liczbą całkowitą ze znakiem. Domyślnie tylko liczby ujemne są poprzedzone znakiem -.
0Jeżeli parametr szerokość jest poprzedzony 0, znaki 0 są wstawiane dopóki minimalna długość tekstu wyjściowego nie zostanie osiągnięta.
(spacja)Poprzedza wartość wyjściową jedną spacją jeżeli jest to liczba nieujemna. Flaga ta jest ignorowana gdy w tagu wystąpiła flaga +.
#Jeżeli flaga zostanie użyta razem ze specyfikatorami o, x, lub X to wynik, który jest niezerowy zostanie poprzedzony 0, 0x lub 0X odpowiednio do typów.

Jeżeli flaga zostanie użyta razem ze specyfikatorami e, E lub f to na wyjściu zostanie wymuszone pojawienie się separatora oddzielającego część całkowitą od ułamkowej. Domyślnie, po wartości całkowitej nie jest wypisywany separator oddzielający (domyślnie jest nim kropka).

Jeżeli flaga zostanie użyta ze specyfikatorami g lub G to na wyjściu zostanie wymuszone pojawienie się separatora oddzielającego część całkowitą od ułamkowej oraz zapobiegnie ucięciu zer końcowych.

Flaga jest ignorowana gdy zostanie użyta z następującymi specyfikatorami typów: c, d, i , u lub s.

Szerokość

SzerokośćOpis
(liczba)Minimalna liczba znaków do wyświetlenia. Jeżeli liczba wyświetlanych znaków jest mniejsza niż podana wartość to wynik będzie uzupełniony spacjami. Wartość nie zostanie obcięta jeżeli wynik jest dłuższy niż wartość podana.
*Szerokość nie jest określona przez tekst sformatowany. Długość tekstu określa się natomiast poprzez argument będący liczbą, który musi wystąpić bezpośrednio przed wypisywaną wartością. Przykład:
C/C++
printf( "%*g", 20, 123.0 );
//Powyższy zapis równoważny jest poniższemu:
printf( "%20g", 123.0 );

Precyzja

.precyzjaopis
.liczbaDla specyfikatorów typów całkowitych tj. d, i, o, u, x oraz X precyzja określa minimalną liczbę cyfr jaka ma zostać wyświetlona. Jeżeli liczba cyfr jest mniejsza od podanej wartości to liczba zostanie uzupełniona zerami wiodącymi. Liczba nie zostanie ucięta jeżeli liczba będzie dłuższa niż podana wartość. Jeżeli długość precyzji będzie wynosiła 0 oraz wartość, która ma zostać wypisana będzie wynosiła 0 to nic nie zostanie wypisane na ekran. Jeżeli nie określono precyzji, domyślną wartością dla wymienionych powyżej typów jest 1.

Dla specyfikatorów typów e, E oraz f precyzja jest maksymalną liczbą cyfr po przecinku jaka ma zostać wypisana.

Dla specyfikatorów typów g i G precyzja oznacza maksymalną liczbę cyfr do wyświetlenia.

Dla specyfikatora s precyzja oznacza maksymalną liczbę znaków jaka może zostać wypisana z łańcucha znaków. Domyślnie wszystkie znaki z łańcucha znaków są wypisywane aż do napotkania znaku terminalnego '\0'.

Dla specyfikatora typu c precyzja nie ma żadnego efektu.
.*Precyzja nie jest określona przez tekst sformatowany. Precyzję określa się natomiast poprzez argument będący liczbą, który musi wystąpić bezpośrednio przed wypisywaną wartością. Przykład:
C/C++
printf( "%.*f", 7, 123.0 );
//Powyższy zapis równoważny jest poniższemu:
printf( "%.7f", 123.0 );

Rozmiar

Rozmiaropis
hArgument jest interpretowany jako short int lub unsigned short int (dotyczy tylko specyfikatorów liczbowych, tj. i, d, u, o, x oraz X).
lArgument jest interpretowany jako long int lub unsigned long int dla specyfikatorów określających argumenty liczbowe tj. i, d, o, u, x oraz X.

Parametr ten stosuje się również do wypisywania znaku unikodowego jak i unikodowego łańcucha znaków stosowanych odpowiednio dla specyfikatorów c i s.
LArgument jest interpretowany jako long double(dotyczy tylko specyfikatorów określających zmiennoprzecinkowe argumenty: f, e, E, g oraz G).

Prefiksy w kompilatorach firmy Microsoft

Niestandardowe prefiksy określające rozmiar danych przekazywanych poprzez argument znajdziesz na stronie http://msdn.microsoft.com​/en-us/library​/tcxf1dw6(v=vs.71).aspx.

Nota bezpieczeństwa

Uwaga! Upewnij się, że tekst sformatowany nie może być wprowadzany przez użytkownika. Jeżeli planujesz wypisywać łańcuch znaków wprowadzony przez użytkownika zrób to w następujący sposób:
C/C++
printf( "%s", sJakisNapis );
Powyższy zapis gwarantuje bezpieczne wypisanie łańcucha znaków na standardowe wyjście. Wywołanie funkcji » standard Cprintf w inny sposób, tj.
printf( sJakisNapis );
 nie jest bezpieczne, bowiem zapis spowoduje błąd krytyczny aplikacji jeżeli w łańcuchu znaków sJakisNapis wystąpi zapis %s.

Zagadnienia powiązane

printfWypisuje tekst sformatowany na standardowym strumieniu wyjścia. (funkcja)

Linki zewnętrzne