case ’s’:
for (sval = va_arg(ap, char *); *sval; sval++) putchar(*sval); break; default:
putchar(*p);
break;
va_end(ap); /* po pracy wyczyść co trzeba */
Ćwiczenie 7.3. Uzupełnij minprintf tak, aby obsługiwała więcej możliwości funkcji printf.
Funkcja scanf jest wejściowym odpowiednikiem funkcji printf - umożliwia większość tych samych przekształceń, lecz w przeciwnym kierunku.
int scanf(char * format, ...)
Funkcja scanf wczytuje znaki ze standardowego wejścia, interpretuje je zgodnie ze specyfikacjami zawartymi w argumencie format i zapamiętuje wyniki w miejscach określonych przez pozostałe argumenty. Argument formatujący będzie opisany dalej; pozostałe argumenty, z których każdy musi być wskaźnikiem, wskazują, gdzie należy przekazać odpowiednio przekształcone dane wejściowe. Tak jak w przypadku printf, niniejszy opis jest tylko podsumowaniem najczęściej używanych możliwości funkcji, a nie ich wyczerpująco przedstawioną listą.
Funkcja scanf zatrzyma się wtedy, kiedy zinterpretuje wszystkie znaki formatu lub gdy pewna dana nie pasuje do żądanej specyfikacji przekształcenia. Jej wartością jest liczba szczęśliwie wczytanych i przypisanych danych wejściowych. Z wartości tej można skorzystać przy ustalaniu liczby znalezionych danych. Po napotkaniu końca pliku funkcja zwraca EOF; podkreślamy to, gdyż ta wartość jest różna od 0 oznaczającego, że najbliższy znak wejściowy nie pasuje do pierwszej specyfikacji przekształcenia. Kolejne wywołanie scanf wznawia szukanie bezpośrednio za ostatnim już wczytanym znakiem.
Mamy także funkcję sscanf, która zamiast ze standardowego wejścia czyta znaki ze wskazanej tablicy:
int sscanffchar *string, char *format, argl, arg2, ...)
7.4 FORMATOWANE WEJŚCIE - FUNKCJA SCANF
Funkcja ta interpretuje tekst zawarty w tablicy string zgodnie zTormatem zadanym w argumencie format i wynikowe wartości umieszcza w miejscach wskazanych przez pozostałe argumenty argl% arg2 itp. Te argumenty muszą być wskaźnikami.
Format zawiera zwykle specyfikacje przekształceń używane do sterowania przekształcaniem danych wejściowych. W formacie mogą wystąpić:
• Odstępy oraz znaki tabulacji - są ignorowane.
• Zwykłe czarne znaki (ale nie %), które spodziewamy się zastać w strumieniu wejściowym.
• Specyfikacje przekształceń złożone ze znaku %, opcjonalnego znaku * wstrzymującego przypisanie, opcjonalnej liczby określającej maksymalny rozmiar pola, jednego z opcjonalnych znaków h, I lub L ustalających rozmiar wyniku oraz ze znaku przekształcenia.
Specyfikacja przekszałcenia steruje przekształceniem następnego pola wejściowego. Normalnie wynik jest wstawiany do zmiennej wskazanej odpowiednim argumentem. Jeśli jednak przypisanie ma być wstrzymane (znak *), to dane pole wejściowe pomija się - nie będzie żadnego przypisania. Polem wejściowym jest z definicji ciąg czarnych znaków; rozciąga się ono albo do najbliższej „białej plamy” (ciągu białych znaków), albo - jeśli podano rozmiar pola - na odległość wskazaną tym rozmiarem. Wynika z tego, że funkcja scanf w poszukiwaniu pól będzie przekraczać granice wierszy, ponieważ znak nowego wiersza jest białym znakiem. (Białymi znakami są: odstęp, znak
Tablica 7.2. Podstawowe przekształcenia funkcji scanf
Znak |
Dana wejściowa |
Typ argumentu |
d |
liczba całkowita dziesiętna |
int * |
• i |
liczba całkowita; może wystąpić w postaci ósemkowej (z wiodącym 0) lub szesnastkowej (z wiodącymi 0x lub 0X) |
int * |
0 |
liczba całkowita w postaci ósemkowej (razem z wiodącym 0 lub bez) |
int * |
u |
liczba całkowita dziesiętna bez znaku |
unsigned int * |
X |
liczba całkowita w postaci szesnastkowej (z wiodącymi 0x lub 0X, albo bez) |
int * |
c |
znaki; następne znaki z wejścia (domyślnie l) umieszcza się we wskazanej tablicy; nie obowiązuje zwykła zasada pomijania białych plam; aby przeczytać najbliższy czarny znak, należy użyć %1s |
char * |
s |
tekst (ale nie napis, tj. ciąg znaków występujący bez znaków cudzysłowu); argument powinien wskazywać na tablicę znakową o rozmiarze wystarczającym do przyjęcia tekstu wraz z dodanym na końcu znakiem ’\0’ |
char * |
«. f.g |
liczba zmiennopozycyjna z opcjonalnym znakiem, opcjonalną kropką dziesiętną i opcjonalnym wykładnikiem |
float * |
% |
literalnie znak %; nie będzie żadnego przypisania |
211