ANSI C 3

ANSI C 3



7 WEJŚCIE I WYJŚCIE ____ ________

printf(s);    /* ŹLE, jeśli w s występuje % */

printf(”%s”, s); /* BEZPIECZNIE */

Funkcja sprintf dokonuje tych samych przekształceń, co printf, ale wynik zapisuje w tablicy znakowej:

int sprintf(char *string, char *format, argl, arg2, ...)

Funkcja sprintf formatuje wartości argumentów argl, arg2 itd. na podstawie specyfikacji przekształceń podanych w argumencie format (według powyższego opisu). Jednak zamiast kierować wynik do wyjścia, umieszcza go w miejscu wskazanym argumentem string. Pamięć wskazywana przez string musi być wystarczająco obszerna, aby pomieścić cały wynikowy tekst.

Ćwiczenie 7.2. Napisz program, który w jakiejś sensownej formie wypisze dowolny strumień znaków wejściowych. Program powinien przynajmniej wypisywać znaki niegraficzne w postaci ósemkowej lub szesnastkowej (zależnie od miejscowych zwyczajów), a także dzielić zbyt długie wiersze.


Zmienna długość list argumentów

Prezentujemy tutaj realizację minimalnej wersji funkcji printf, aby pokazać, jak napisać przenośnie funkcję posługującą się listą argumentów o zmiennej liczbie elementów. Głównie interesuje nas przetwarzanie argumentów, toteż nasza funkcja minprintf będzie sama opracowywała format i resztę argumentów, ale do wykonania przekształceń formatujących wywoła prawdziwą printf.

A oto właściwa deklaracja funkcji printf: int printf(char *fmt, ...)

w której deklaracja ... (trzy kropki) oznacza, że liczba i typy pozostałych argumentów nie są znane. Taka deklaracja może wystąpić jedynie na końcu listy argumentów. Zatem naszą funkcję minprintf deklarujemy następująco:

void minprintf(char *fmt, ...)

nie będziemy bowiem zwracać licznika znaków, tak jak to robi printf.

Sztuczka polega na tym, że minprintf maszeruje wzdłuż listy argumentów, choć tafli* ma nawet nazwy. Standardowy nagłówek <stdarg.h> zawiera zestaw makr, które finiują sposób poruszania się po takiej liście. Realizacje tego nagłówka będą różn‘L

7.3 ZMIENNA DŁUGOŚĆ LIST ARGUMENTÓW

powered by


Mi sio


się między sobą zależnie od maszyny, ale posługiwanie się nim jest dym środowisku C.

Zmienną odnoszącą się po kolei do każdego argumentu deklaruje się z typem va_list. W funkcji minprintf taka zmienna nazywa się ap, czyli wskaźnik do argumentów (od ang. argument pointer). Standardowe makro va_start inicjuje zmienną ap tak, aby wskazywała na pierwszy nienazwany argument. Ogólnie na liście argumentów musi wystąpić co najmniej jeden argument z nazwą; makro va_start, aby rozpocząć działalne, potrzebuje ostatniego nazwanego argumentu.

Każde wywołanie makra va_arg udostępnia jeden argument i przesuwa ap do następnego; do określenia typu szukanej wartości i rozmiaru kroku, o jaki trzeba przesunąć ap, makro va_arg potrzebuje nazwy typu. Ostatnie makro va_end czyści wszystko, co wymaga czyszczenia; va_end musi być wywołane przed zakończeniem działania funkcji.

Te właściwości tworzą podstawę działania naszej uproszczonej wersji printf:

#include <stdarg.h>

#include <stdio.h>

I* minprintf: minimalna printf ze zmienną listą argumentów */ void minprintf(char *fmt, ...)

{

va Jist ap; /* wskazuje po kolei każdy nienazwany argument */ char *p, *sval; int ival; double dval;

va_start(ap, fmt); /* ap wskazuje 1. nienazwany argument */ for (p = fmt; *p; p++) { if (*p != '%’) { putchar(*p); continue;

}

switch (*++p) { case 'd ’:

ival = va_arg(ap, int); printf(”%d”, ival); break; case ’f’:

dval = va_arg(ap, double); printf(”%f', dval); break;

209


Język ANSI C


Wyszukiwarka

Podobne podstrony:
ANSI C 1 7 WEJŚCIE I WYJŚCIE Najprostszym mechanizmem wejścia jest czytanie po jednym znaku ze sta
ANSI C 2 7 WEJŚCIE I WYJŚCIE_______- kretnej maszynie, programom z nich korzystającym oszczędzono
ANSI C 5 7 WEJŚCIE I WYJŚCIE______ tabulacji, znak nowego wiersza, znak powrotu karetki, znak tabu
ANSI C 6 7 WEJŚCIE I WYJŚCIE_______ Ćwiczenie 7.5. Napisz na nowo program kalkulatora przyrostkowe
ANSI C 7 7 WEJŚCIE I WYJŚCIE ^ OBSŁUGA BŁĘDÓW - PLIK STDERR I FUNKCJA EXIT Funkcje getchar i putch
ANSI C 8 7 WEJŚCIE I WYJŚCIE #include <stdio.h> /* cat: sklej zawartość plików, wersja 2 */
ANSI C 9 7 WEJŚCIE I WYJŚCIE Aby wykazać, że nie ma nic magicznego w takich funkcjach, jak fgets i
ANSI C 0 7 WEJŚCIE I WYJŚCIE 7.8.2 Badanie klasy znaków i ich przekształcenia Wiele funkcji ze sta
ANSI C 1 7 WEJŚCIE I WYJŚCIE W punkcie 8.7 pokażemy taką realizację dystrybutora pamięci podobnego
przejscia bmp -Przejście strony... Wejście na stronę Czas akcji
66 ROZDZIAŁ JO. PODSTAWOWE PROCEDURY WEJŚCIA I WYJŚCIAFunkcje wyjścia Funkcja printf W przykładzie
p1020858 Rozkazy wejścia-wyjścia3S CPU podaje adres B definicja modułu (i urządzenia, jeśli >1
p1020906 (3) Kanały wejścia-wyjścia 3€ Ewolucja urządzeń we-wy, np. karty graficzne 3D CPU zleca wyk
p1020858 Rozkazy wejścia-wyjścia3S CPU podaje adres B definicja modułu (i urządzenia, jeśli >1

więcej podobnych podstron