Funkcje printf i scanf¶
Znaki specjalne¶
- - znak nowej linii
- - tabulacja pozioma
\v
- tabulacja pionowa\b
- backspace\a
- alarm\\
- backslash\?
- znak\`
- apostrof\"
- cudzysłów
Formaty typów¶
Typ | Format |
---|---|
char |
%c |
unsigned char |
%c |
short |
%h |
unsigned short |
%uh |
int |
%d , %i |
unsigned int |
%u |
long int |
%ld |
unsigned long int |
%lu |
long long int |
%lld |
unsigned long long int |
%llu |
float |
%f , %F |
double |
%lf |
long double |
%Lf |
char* |
%s |
Formaty specjalne¶
Opis | Format |
---|---|
notacja naukowa | %e , %E |
notacja standardowa lub naukowa, w zależności od wielkości liczby | %g , %G |
unsigned int w formacie oktalnym (ósemkowym) |
%o |
unsigned int w formacie heksadecymalnym (szesnastkowym) |
%x , %X |
double w formacie heksadecymalnym (szesnastkowym) |
%a , %A |
Biblioteka¶
Funkcje printf
oraz scanf
znajdują się w standardowej bibliotece wejścia/wyjścia (standard input/output):
Printf¶
Funkcja printf
przyjmuje dwa argumenty:
- format wypisywanego komunikatu,
- listę oddzielonych przecinkami wartości do podstawienia.
Format jest standardowym tekstem, który może zawierać specjalne symbole określające, że w tym miejscu komunikatu ma zostać podstawiona kolejna wartość, przekazana jako drugi argument.
Funkcji printf
możemy także użyć do wypisania komunikatu bez podawania wartości do podstawienia.
Każdy symbol specjalny składający się ze znaku %
i litery oznacza, że w to miejsce należy wstawić odpowiednią wartość. Np. %d
w formacie zostanie zastąpiony wartością typu int
podaną jako kolejny argument funkcji printf
.
String¶
Najprostszym sposobem na wypisanie zmiennej typu string
za pomocą funkcji printf
, jest przekonwertowanie zmiennej na ciąg znaków z języka C (const char*
) z użyciem funkcji c_str()
.
Formatowanie szerokości¶
Możemy wypisać wartość w polu o zadanej minimalnej szerokości. Aby to zrobić, bezpośrednio po znaku % podajemy liczbę określającą szerokość pola. Domyślnie wartości będą wyrównywane do prawej.
Aby wyrównać wartości do lewej, należy podać szerokość pola jako liczbę ujemną.
Uzupełnienie do szerokości pola¶
Wypisywaną wartość liczbową możemy uzupełnić zerami z lewej strony do wymaganej szerokości pola. W tym celu piszemy %0, zadaną szerokość pola i znak formatu.
Liczby rzeczywiste¶
Domyślnie przy wypisywaniu liczb rzeczywistych zostaną one wypisane z dokładnością do 6 miejsc po przecinku. Możemy to jednak zmienić, pisząc %. i zadaną dokładność. Wartość zostanie zaokrąglona do zadanej liczby miejsc po przecinku.
Możemy także połączyć określenie szerokości pola z dokładnością do zadanej liczby miejsc po przecinku. Należy pamiętać, że szerokość uwzględnia całą liczbę, łącznie ze znakiem kropki.
Notacja naukowa¶
W celu wypisania liczby rzeczywistej w formacie naukowym używamy formatu %e
.
printf("%e", 5.65); // 5.650000e+00
printf("%e", 5.653745343438343); // 5.653745e+00
printf("%e", 4342342343245.0); // 4.342342e+12
Znak liczby¶
Aby zawsze wypisywać znak liczby, a nie tylko przy wartościach ujemnych, możemy podać znak \(+\) przed literą formatu.
Inne systemy liczbowe¶
Za pomocą printf
możemy w łatwy sposób wypisać liczbę naturalną w systemie oktalnym lub heksadecymalnym. Służą do tego odpowiednio formaty %o
i %x
.
Link do przykładów¶
Scanf¶
Funkcja scanf
pozwala nam wczytać dane od użytkownika. Jej użycie wygląda podobnie do printf
. Najpierw podajemy format, a następnie zmienne, do których chcemy wczytać poszczególne wartości. W formacie zazwyczaj ograniczamy się do podania formatów wczytywanych wartości. Zmienne natomiast muszą być podane jako adres w pamięci, pod którym należy zapisać wczytaną wartość. Dlatego zazwyczaj zmienne poprzedzamy symbolem &
.
Ignorowanie znaku %¶
Możemy zignorować znak % podany na wejściu.
Inne systemy liczbowe¶
Podobnie jak w przypadku printf
, scanf
możemy użyć do wczytania liczb w formatach oktalnym i heksadecymalnym.
int a, b;
scanf("%o", &a); // 012
scanf("%x", &b); // Af
printf("a = %d, b = %d", a, b); // a = 10, b = 175
Wczytywanie tekstów¶
Podobnie jak printf
, scanf
także nie obsługuje typu string. Możemy zamiast tego wczytać tekst do tablicy typu char. W przypadku tablic nie podajemy znaku &
, ponieważ nazwa zmiennej tablicowej zwraca adres w pamięci, gdzie znajduje się początek tablicy.
Alternatywnie:
Ignorowanie wejścia¶
Aby wczytać i zignorować wejście (lub jego fragment), czyli nie przypisywać wartości do zmiennej, możemy po znaku %
dać *
.
Maksymalna długość wejścia¶
Możemy określić, ile maksymalnie znaków ma zostać wczytanych. Reszta danych zostanie zignorowana.
Możemy też nie ignorować reszty wejścia i przypisać je do kolejnej zmiennej.
Koniec wejścia¶
W momencie napotkania końca wejścia, funkcja scanf
zwróci stałą EOF
. W celu wczytywania wejścia aż do jego końca możemy więc np. zastosować taką pętlę: