1. Wprowadzanie danych z klawiatury – funkcja scanf
Deklaracja
int scanf ( const char *format, wskaźnik, wskaźnik, ... ) ;
Biblioteka
stdio.h
Działanie
Funkcja scanf wczytuje kolejne pola (ciągi znaków), ograniczone znakiem spacji ' ' lub nowej linii '\n'. Obrazy wczytywanych znaków są wyświetlane na ekranie monitora. Liczba wczytywanych pól i sposób ich przetwarzania są zadawane za pomocą pierwszego argumentu funkcji scanf, oznaczonego identyfikatorem format, którego wartością jest ciąg znaków (teskt). Ciąg ten składa się z pewnej liczby wzorców konwersji - liczba wzorców występujących w formacie określa liczbę pól wczytywanych ze strumienia wejściowego (klawiatury) i liczbę wskaźników będących dalszymi argumentami funkcji scanf . Wzorzec konwersji ma następującą postać:
% [ * ] [ szerokość ] [ prefiks ] znak_konwersji
Każdy wzorzec rozpoczyna się zawsze od znaku procenta %, składniki umieszczone w nawiasach prostokątnych nie muszą występować. Znak gwiazdki * użyty we wzorcu nakazuje pominąć kolejne pole znaków ze strumienia wejściowego. Szerokość określa maksymalną liczbę znaków, które mają być pobrane z kolejnego pola. Pole to może być krótsze niż zadana szerokość - w takim przypadku przetworzone będą jedynie znaki znajdujące się przed znakiem spacji lub nowej linii. Prefiks i znak_konwersji określają sposób przetworzenia znaków pola - wynikiem tego przetwarzania jest najczęściej wartość binarna liczby określonego typu. Kolejne wzorce konwersji są powiązane z kolejnymi wskaźnikami będącymi dalszymi argumentami funkcji scanf - obliczona wartość binarna liczby jest wprowadzana do obszaru pamięci wskazanego przez związany z danym wzorcem wskaźnik. Zakłada się przy tym, że typ wskaźnika związanego z wzorcem jest taki sam, jak typ konwersji zadanej w tym wzorcu. W tabelach podano znaczenie poszczególnych znaków konwersji i prefiksów
znak k.
wejściowe pole znaków
typ wskaźnika
d
liczba całkowita dziesiętna
int*
D
long*
o
liczba całkowita oktalna
O
i
liczba całkowita dziesiętna, oktalna lub heksadecymalna
I
u
liczba całkowita dziesiętna bez znaku
unsigned int*
U
unsigned long*
x
liczba całkowita heksadecymalna
X
e, E
liczba zmiennopozycyjna
float*
f
g, G
s
ciąg znaków
char*
c
znak
prefiks
znaki konwersji
h
d, i, o, u, x
short*
l
e, f, g
double*
L
long double*
Pola reprezentujące liczby (poza konwersją u, U ) mogą rozpoczynać się od znaków plus + lub minus - . W przypadku wczytywania ciągu znaków (konwersja s ) kody kolejnych znaków są lokowane w kolejnych bajtach pamięci, począwszy od bajtu wskazanego przez wskaźnik związany z danym wzorcem konwersji. Konieczne więc jest zarezerwowanie odpowiednio dużego obszaru pamięci, w którym znaki te będą umieszczane. Po ostatnim wczytanym znaku (różnym od znaku spacji lub nowej linii) jest umieszczany znak końca ciągu o wartości 0. Za pomocą konwersji s nie można wczytać tekstu złożonego z kilku słów oddzielonych spacjami. W takim przypadku można skorzystać z konwersji wyliczeniowej o postaci:
[ -~]
W nawiasach klamrowych podano przedział znaków ASCII (od znaku spacji do znaku tyldy), który będzie akceptowany i wprowadzany. Pierwszy znak spoza tego przedziału (czyli np. znak nowej linii) kończy wprowadzany tekst. Podczas wprowadzania znaków z klawiatury można używać klawisza Backspace do kasowania poprzednio wprowadzonych znaków. Prefiks umieszczony przed znakiem konwersji redefiniuje znaczenie tego znaku.
Wynik
Wynikiem funkcji scanf jest liczba pól znaków, które zostały poprawnie wczytane, poddane konwersji, a obliczone wartości zostały zapamiętane.
Przykład
#include <stdio.h>
void main ( void )
{
............
char cZnak ;
int nElement, nSkładnik, *pnAdres = &nSkładnik ;
int anTablica [ 20 ] ;
long lDługi, lPodłużny ;
float flUłamek ;
double dbDokładny ;
long double ldPrecyzyjny ;
char *szFormat = "%f%lf%Lf" ;
char *szSłowo = new char [ 10 ] ;
char acZnaki [ 16 ] ;
char acTekst [ 65 ] ;
//
scanf ( "%c%d", &cZnak, &nElement); // identyfikatory
scanf ( "%i", pnAdres ) ; // wskaźnik
scanf ( "%d%d", &anTablica [ 0 ], &anTablica [ 19 ] ) ;
scanf ( "%D%ld", &lDługi, &lPodłużny ) ;
scanf ( szFormat, &flUłamek, &dbDokładny, &ldPrecyzyjny) ;
scanf( "%s%s", szSłowo, acZnaki ) ;
scanf ( "%[ -~]", acTekst ) ;
..........
}
Uwaga
Funkcja scanf przerywa działanie w przypadku napotkania znaku niedozwolonego (np. znaku litery w liczbie całkowitej). Znak ten nie jest usuwany ze strumienia wejściowego, co niekiedy powoduje zapętlenie programu. Sytuacji tej można uniknąć, sprawdzając liczbę przetworzonych poprawnie pól znakowych, przekazywaną jako wynik funkcji scanf.
2. Wyprowadzanie danych na monitor ekranowy – funkcja printf
int printf (const char *format, wyrażenie, wyrażenie, ... ) ;
Funkcja printf umożliwia wyprowadzanie ciągów znaków reprezentujących wartości wyrażeń, które są jej argumentami. Sposób wyprowadzania określa argument format będący ciągiem znaków zawierającym:
- znaki przesyłane bezpośrednio na ekran monitora,
- wzorce konwersji definiujące sposób przetwarzania wartości wyrażeń na ciągi znaków.
Liczba wzorców konwersji powinna być równa liczbie wyrażeń, kolejne wzorce określają sposób przetwarzania wartości kolejnych wyrażeń. Wzorzec konwersji ma postać:
% [ opis ] [ szerokość ] [ . precyzja ] [ prefiks ] znak_konwersji
Wzorzec konwersji rozpoczyna się od znaku procentu %, składniki zapisane w nawiasach kwadratowych mogą nie występować. Prefiks i znak_konwersji określają sposób przekształcania wartości wyrażenia odpowiadającego danemu wzorcowi konwersji na ciąg znaków - składniki te muszą być dostosowane do typu wartości wyr...
tomasz.kubiak.sap