7 WEJŚCIE I WYJŚCIE_______-
kretnej maszynie, programom z nich korzystającym oszczędzono wiedzy o dostępnym zbiorze znaków.
Ćwiczenie 7.1. Napisz program, który przekształca wielkie litery na małe lub małe litery na wielkie w zależności od tego, z jaką nazwą został wywołany; nazwa ta figuruje w argv[0].
Wyjściowa funkcja printf tłumaczy wewnętrzne wartości na znaki. W poprzednich rozdziałach stosowaliśmy ją nieformalnie. Opis, który tu przedstawiamy, wyczerpuje najbardziej typowe zastosowania, ale nie jest kompletny - taki opis znajdziesz w dodatku B.
# • *
int printf(char *format, argl, arg2 ...)
Funkcja printf pod nadzorem argumentu format przekształca, formatuje i wypisuje swoje argumenty do standardowego wyjścia. Jej wartością jest liczba wypisanych znaków.
O . . ' !
Format zawiera obiekty dwojakiego rodzaju: zwykłe znaki, które są kopiowane do strumienia wyjściowego, oraz specyfikacje przekształceń, z których każda wskazuje sposób przekształcenia i wypisania kolejnego argumentu funkcji printf. Każdą specyfikację przekształcenia rozpoczyna znak %, a kończy znak charakterystyczny dla tego przekształcenia. Między znakiem % i znakiem przekształcenia mogą - w następującej kolejności - wystąpić:
• Minus, zlecający dosunięcie przekształconego argumentu do lewego krańca jego
pola. I
• Liczba określająca minimalny rozmiar pola. Przekształcony argument będzie wpi- j sany do pola o co najmniej takim rozmiarze. Jeśli trzeba, pole zostanie uzupełnione do pełnego rozmiaru z lewej strony (lub z prawej, jeśli żądano dosunięcia w lewo).
• Kropka, oddzielająca rozmiar pola od precyzji.
• Liczba określająca precyzję, tj. maksymalną liczbę znaków dla tekstu, liczbę cyfr
po kropce dziesiętnej dla wartości zmiennopozycyjnej lub minimalną liczbę cyfr ! dla wartości całkowitej. '
• Jedna z liter: h - jeśli argument całkowity należy wypisać jako short, lub I (litera el) - jeśli jako long.
Znaki przekształcenia figurują w tabl. 7.1. Działanie funkcji nie jest określone, jeżeli znak następujący po % nie jest znakiem przekształcenia.
powered by
7.2 FORMATOWANE WYJŚCIE - FUNKCJA PRINTF___fi-^;.
Tablica 7.1. Podstawowe przekształcenia funkcji printf
Znak |
Typ argumentu |
Dana wyjściowa |
d.i |
int |
liczba dziesiętna |
0 |
int |
liczba ósemkowa bez znaku (bez wiodącego zera) |
x, X |
int |
liczba szesnastkowa bez znaku (bez wiodących 0x lub 0X) z literami abedef lub ABCDEF dla 10, ..., 15 |
u |
int |
liczba dziesiętna bez znaku |
c |
int |
jeden znak |
s |
char * |
ciąg znaków wypisywany do napotkania ’\0' lub wyczerpania liczby znaków określonej przez precyzję |
f |
double |
[-]m.dddddd. gdzie liczbę cyfr d określa precyzja (domyśl-nie 6) |
e, E |
double |
[-]m.dddddde±xx lub [-]m.ddddddE±xx, gdzie liczbę cyfr d określa precyzja (domyślnie 6) |
g.G |
double |
wypisana w formacie %e lub %E, jeśli wykładnik jest mniejszy niż -4 albo większy lub równy precyzji; w przeciwnym przypadku wypisana w formacie %f; nic wypisuje się nieznaczących zer i kończącej kropki dziesiętnej |
P |
void * |
wskaźnik (postać zależna od implementacji) |
% |
nie ma przekształcenia argumentu; wypisany znak % |
Szerokość pola lub precyzję można w specyfikacji zastąpić znakiem *, co oznacza, że żądaną liczbę należy obliczyć przekształcając kolejny argument funkcji (argument musi być typu int). Na przykład, wypisanie co najwyżej max znaków z s wygląda tak:
printf(”%.*s”, max, s);
Większość przekształceń formatujących prezentowaliśmy już w poprzednich rozdziałach. Jednym z wyjątków jest precyzja odnosząca się do tekstów. Następujące zestawienie pokazuje działanie różnych specyfikacji podczas wypisywania tekstu „ahoj, przygodo” (14 znaków). Aby można było ocenić rozmiary pól, otoczyliśmy je dwukropkami.
:%s: |
:ahoj, przygodo: |
:%10s: |
:ahoj, przygodo: |
:%.10s: |
:ahoj, przy: |
:%~1 Os: |
:ahoj, przygodo: |
:%.20s: |
:ahoj, przygodo: |
:%-20s: |
:ahoj, przygodo |
:%20.10s: |
: ahoj, |
20.10s: |
:ahoj, przy |
Uwaga: funkcja printf używa swojego pierwszego argumentu do określenia liczby 1 typów pozostałych argumentów. Jeżeli nie podałeś wystarczającej liczby argumentów lub są one złego typu, to funkcja będzie zdezorientowana, a Ty otrzymasz błędne wyniki. Powinieneś więc zdawać sobie sprawę z różnicy między tymi wywołaniami:
207