RSS


[ Pobierz całość w formacie PDF ]

zowana sekwencja sterująca).
40 Wgłąb języka C
l (litera el)
Może ona wystąpić w sekwencji wyprowadzającej liczbę całkowitą i mówi, że na sto-
sie znajduje się liczba typu long a nie int jak przyjmowane jest domyślnie.
Wystąpienie w ciągu sterującym format napisu %% spowoduje wyprowadzenie znaku
% (procent). Ciągi, w których po znaku % nie występuje żaden z opisanych wyżej
specyfikatorów ani znak %, są traktowane różnie w różnych kompilatorach.
Oto kilka przykładów ilustrujących zastosowanie tych elementów specyfikacji,
które mogą budzić wątpliwości (w komentarzach podano wynik działania; znaki
| oznaczają granice pola:
printf("%*s",12,"ciąg próbny"); /* | ciąg próbny| */
printf("%*.*f",10,2,3.141); /* | 3.14| */
printf("%.4s","ciąg próbny"); /* |ciąg| */
printf("%-7.4s","ciąg próbny"); /* |ciąg | */
printf("%2s","ciąg próbny"); /* |ciąg próbny| */
printf("%07d",13); /* |0000013| */
printf("%-07d",13); /* |13 | */
printf("%lx",(long)-1); /* |ffffffff| */
printf("%.1d",10000); /* |10000| */
Funkcja printf zwraca wartość całkowitą równą liczbie wyprowadzonych zna-
ków. Jeżeli w czasie wyprowadzania wystąpił jakiś błąd, funkcja ta zwraca wartość
EOF.
2.2. Funkcja fprintf
Deklaracja:
int fprintf(FILE *plik,const char *format, ... );
Funkcja fprintf służy do wyprowadzania danych do pliku identyfikowanego przez
obowiązkowy argument FILE *plik. Jej działanie i interpretacja ciągu sterują-
cego format są identyczne jak dla funkcji printf. Wynikiem funkcji fprintf jest licz-
ba wyprowadzonych znaków albo wartość EOF w przypadku wystąpienia błędu.
Istnieją trzy wyróżnione, predefiniowane pliki, do których funkcja fprintf może
wyprowadzać informację:
K stdout  standardowe wyjście. Wywołanie funkcji fprintf z plikiem st-
dout jako argumentem jest równoważne wywołaniu funkcji printf.
K stderr  standardowe wyjście dla błędów. Wyjście to, zawsze gdy to jest
możliwe, skojarzone jest z konsolą operatorską. Jak wskazuje nazwa,
głównym przeznaczeniem pliku stderr jest wypisywanie wszelkich ko-
III Formatowane wejście/wyjście 41
munikatów dla użytkownika (szczególnie informacji o błędach). Dzięki
zastosowaniu pliku stderr komunikaty te będą pojawiać się na ekranie
nawet wtedy, gdy wyjście programu zostanie skierowane do pliku lub na
wejście innego programu.
K stdprn  standardowa drukarka.
2.3. Funkcja sprintf
Deklaracja:
int sprintf(char *ptr,const char *format, ... );
Funkcja sprintf działa tak jak printf ale wyprowadza swoje argumenty do obszaru
w pamięci, wskazywanego przez obowiązkowy argument ptr. Rezultatem, tak jak
w przypadku poprzednich funkcji, jest liczba wyprowadzonych znaków albo war-
tość EOF w przypadku wystąpienia błędu. Przykłady zastosowań funkcji sprintf
przedstawiono przy okazji omawiania funkcji sscanf.
2.4. Funkcje vprintf, vfprintf, vsprintf
Deklaracje:
int vprintf(const char *format, va_list arg );
int vfprintf(FILE *plik,const char *format, va_list arg
);
int vsprintf(char *ptr,const char *format, va_list arg
);
Jak widać z prototypów trzy powyższe funkcje nie są funkcjami o zmiennej licz-
bie argumentów. Zamiast parametru ... posiadają one parametr typu va_list.
%7łeby zrozumieć działanie i przeznaczenie tych funkcji, zastanówmy się najpierw
nad kwestią bardziej ogólną: jak funkcja o zmiennej liczbie argumentów może
przekazać swoje argumenty innej funkcji. Nie można po prostu umieścić ich ko-
lejno w wywołaniu tej funkcji po pierwsze dlatego, że nie mają identyfikatorów,
a po drugie (co ważniejsze) dlatego, że nie wiadomo ile ich jest. Jedyną sensow-
ną metodą przekazania argumentów jest przekazanie wartości lokalnej zmiennej
typu va_list, deklarowanej lokalnie w funkcji o zmiennej liczbie parametrów
i wskazującej na listę argumentów na stosie. Opisany sposób przekazywania ar-
gumentów najlepiej zilustruje przykład:
float srednia(int jaka, ... ) /* w MS C char
jaka */
{ /* działałoby zle */
va_list arg;
va_start(arg,jaka);
switch(jaka)
{
case 'w' :
case 'W' : return _harmoniczna(arg);
42 Wgłąb języka C
case 'a' :
case 'A' : return _arytmetyczna(arg);
case 'k' :
case 'K' : return _geometryczna(arg);
}
va_end(arg);
}
float _arytmetyczna(va_list arg) /* średnia
arytmetyczna */
{
int il=va_arg(arg,int),i=il; /* pierwszy arg. =
ilość */
float suma=0;
while(i--)suma+=va_arg(arg,int); /* sumuj
... */
return il?suma/il:0; /* ... i podziel przez
ilość */
}
Funkcja srednia, oblicza średnią określoną przy pomocy obowiązkowego argu-
mentu jaka. Zrednia obliczana jest na podstawie ciągu liczb całkowitych przekaza-
nych jako kolejne argumenty, przy czym pierwsza liczba określa długość ciągu tj.
ile liczb zostało przekazanych jako argumenty (nie licząc tej właśnie liczby).
Funkcja srednia korzysta z usług trzech funkcji, którym przekazuje wartość
zmiennej arg, wskazującej obszar pamięci zawierający jej argumenty. Funkcje te
pobierają argumenty i obliczają ich średnią używając odpowiedniej metody. Czyn-
ność pobrania argumentów jest tutaj rozłożona na dwie funkcje. Funkcja srednia
posiada lokalną zmienną arg typu va_list, którą inicjuje makrem va_start tak, żeby
wskazywała na argumenty na stosie. Funkcja ta nie pobiera jednak swoich argu-
mentów makrem va_arg. Natomiast funkcja _arytmetyczna, będąca normalną
funkcją o jednym argumencie, pobiera argumenty od funkcji srednia w sposób
typowy dla funkcji ze zmienną liczbą argumentów, używając makra va_arg.
Funkcje vprintf, vsprintf i vfprintf podobne są do funkcji _arytmetyczna
opisanej w powyższym przykładzie. Mogą one być wywoływane z funkcji
o zmiennej liczbie argumentów. Przykładowo:
void drukuj(const char *format, ... )
{
va_list arg;
va_start(arg,format);
vfprintf(stdprn,format,arg);
va_end(arg);
}
Opisywane funkcje stosowane są do pisania specyficznych funkcji formatowanego [ Pobierz całość w formacie PDF ]
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • cherish1.keep.pl