printf
Opis
Funkcja służy do wyświetlania tekstu na standardowym wyjściu, którym domyślnie jest ekran. Jako pierwszy parametr podajesz tzw. łańcuch formatujący (format). Jest to po prostu string w którym niektóre kody (sekwencje znaków) zostaną zastąpione wartościami pozostałych parametrów.
Na przykład mamy zmienne:
char *imie="Ala";
int wiek=5;
printf("%s ma %i lat.",imie,wiek);
Wyświetli następujący tekst:
Ala ma 5 lat.
Jak widzisz kod %s został zastąpiony wartością zmiennej imie, a %i wiek. Poniższa tabela zawiera wykaz znaków typu w zależności od typu parametru.
Znak typu |
Wartość wyjściowa |
Przykładowe typy parametrów |
Przykład |
d |
Dziesiętna ze znakiem |
int, long, long long |
982 |
i |
Dziesiętna ze znakiem |
int, long, long long |
982 |
o |
Ósemkowa bez znaku |
int, long, long long |
1726 |
u |
Dziesiętna bez znaku |
unsigned int, unsigned long, unsigned long long |
982 |
x |
Szesnastkowa bez znaku, używa małych liter |
int, long, long long, unsigned int, unsigned long, unsigned long long |
3d6 |
X |
Szesnastkowa bez znaku, używa wielkich liter |
int, long, long long, unsigned int, unsigned long, unsigned long long
|
3D6 |
e |
Liczba rzeczywista (dziesiętna) w postaci wykładniczej |
float, double |
3.45e+3 |
E |
Liczba zmiennoprzecinkowa w postaci wykładniczej |
float, double |
3.45E+3 |
f |
Zmiennoprzecinkowa |
float, double |
1.03.1961 |
g |
Zmiennoprzecinkowa, działa jak e lub f zależności od precyzji |
float, double |
|
G |
Zmiennoprzecinkowa, działa jak E lub f zależności od precyzji |
float, double |
|
c |
Znak |
char |
A |
s |
Łańcuch znaków |
char *, char [] |
Ala |
n |
Umieszcza we wskazanym miejscu liczbę dotychczas wysłanych znaków |
int * |
|
P |
Wskaźnik, wyświetla adres |
|
A100:0012 |
Podając parametry w łańcuchu trzeba pamiętać o możliwości konwersji. Na przykład:
char c='A';
printf("Znak%c ma kod %i",c,c);
Wyświetli:
Znak A ma kod 65
Dzieje się tak dlatego, że w drugim przypadku podając znak formatujący %i parametr (zmienna) c zostanie skonwertowana na int.
Do konwersji może dochodzić również w przypadku innych znaków formatujących i typów parametrów.
Funkcja printf pozwala również na dodatkowe formatowanie. Poniższa tabela przedstawia znaki modyfikujące rozmiar parametru. Należy je podawać przed znakiem formatującym, na przykład modyfikując znak d modyfikatorem l zamiast %d piszesz %ld.
Modyfikator |
Działanie |
Modyfikator znaku formatującego |
h |
Parametr traktuje się jakby był typu short int |
d, i, o, u, x, X |
l |
Parametr traktuje się jakby był typu long int dla parametrów całkowitych i double dla zmiennoprzecinkowych |
d, i, o, u, x, X |
L |
Parametr traktuje się jakby był typu long double dla parametrów zmiennoprzecinkowych |
e, E, f, g, G |
Pamiętaj, że czasem brak modyfikatora rozmiaru powoduje błędny wyświetlenie wartości zmiennej, choć jest ona prawidłowa. Możesz wówczas stracić wiele czasu zastanawiając się dlaczego np. wynik obliczeń jest błędny, gdy w rzeczywistości jest on prawidłowy, a został jedynie źle wyświetlony. Dotyczy to zwłaszcza wielkich wartości i jest skutkiem błędnej konwersji.
Możesz tez formatować wyświetlane liczby na przykład decydując ile miejsc po przycinku ma się wyświetlić. W przypadku liczb zmiennoprzecinkowych (znaki formatujące e, E, f, g, G) robisz to podając .n, gdzie n jest liczbą miejsc po przecinku, np.:
float x=10.2;
printf("x=%.3f\n",x);
Wyświetli:
x=10.200
czyli 3 miejsca po przecinku. Podając .0 pomijasz w ogóle część ułamkową. Możesz też wpisać, np.:
printf("x=%6.2f\n",x);
wówczas 6 będzie całkowitą liczbą znaków i zostaną one wyrównane do prawej strony:
x=10.20
Zauważ, że "10.20" to 5 znaków, zatem do sześciu znaków będzie uzupełnione spacjami.
Zastosowanie specyfikatora precyzji dla liczby całkowitej, spowoduje uzupełnienie brakujących miejsc zerami, np.:
int x=12;
printf("x=%.3i\n",x);
wyświetli:
x=012
Używając funkcji printf możliwe jest również justowanie (wyrównywanie) tekstu. Flagi służące do tego celu przedstawia poniższa tabela.
Flaga |
Działanie |
Flaga znaku formatującego |
- |
Wyrównuje wyświetlaną wartość do n znaków, uzupełniając brakujące miejsca spacjami po prawej stronie |
X, x, E, e, f, G, g, d, i, u, s, c |
+ |
Wyświetla znak "-" lub "+" zależnie od wartości |
X, x, E, e, f, G, g, d, i, u |
Spacja |
Wyświetla znak "-" lub spację zależnie od wartości |
X, x, E, e, f, G, g, d, i, u |
# |
W przypadku liczby całkowitej poprzedza ją zerem. Natomiast w przypadku liczby zmiennoprzecinkowej umieszcza przecinek niezależnie od jej wartości |
X, x, E, e, f, G, g |
Powyższe flagi można ze sobą dowolnie łączyć.
Tu możesz pobrać przykładowy programik pokazujący, jak przy pomocy funkcji printf wyświetlić tabelę.
Zwracana wartość
Funkcja printf zwraca ilość wysłanych znaków, natomiast w przypadku błędu wartość ujemną.
W zasadzie jest nieprawdopodobne aby we współczesnych czasach printf nie zadziałało, ale zawsze możesz zapisać:
if (printf(...)<0) reakcja na błąd
Można to też użyć do innych celów, na przykład:
#include <cstdlib>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
int n;
char imie[20];
printf("Jak Ci na imie? ");
scanf("%s",imie);
n=printf("Witaj %s!\n",imie);
printf("Powitanie mialo %i znakow\n",n);
system("PAUSE");
return EXIT_SUCCESS;
}
Wynik działania programu może być na przykład taki:
Jak Ci na imie? Kuba
Witaj Kuba!
Powitanie mialo 12 znakow
Aby kontynuować, naciśnij dowolny klawisz . . .
Dlaczego 12 znaków a nie 11? Ponieważ na końcu znajduje się znak końca linii, czyli \n.
PRINTF i SCANF, czy CIN i COUT C++
Przykład użycia funkcji PRINTF i SCANF jako
alternatywnego (dla cin, cout) rozwiązania dla wprowadzania i
wyprowadzania danych z programu w języku C++. Artykuł zawiera przykładowy
program wraz z krótkim opisem najczęściej wykorzystywanych
sekwencji specjalnych. Znajdziesz tu szybką informację, jak użyć
powyższych funkcji w swoich programach w
miejsce popularniejszych CIN
i COUT.
Stosowanie PRINTF i SCANF jest z
pewnością trudniejsze, polecane jest przy
rozwiązywaniu algorytmów o dużej ilości danych wejściowych i
wyjściowych, gdyż znacznie poprawia szybkość tych operacji.
#include<conio.h>
#include<stdio.h>
int main()
}
printf("Program wyznacza miejsce zerowe rownania
liniowego.\n");
printf("Funkcja ma postac: f(x)=a*x+b\n");
int a,b;
printf("Podaj a: \t");
scanf("%d",&a);
*/
%d %f informacja dla kompilatora, jakiego typu
zmienna wczytujemy
dla int %d
dla float -> %f
%.2f liczba float zaokraglona do 2 miejc
dziesietnych
%4.2f liczba float 4 znaki w tym 2 dziesietne
/*
printf("Podaj b: \t");
http://lo1.lebork.pl - Liceum Ogólnokształcące Nr 1 w Lęborku - LO 1 Lębork Powered by Mambo Generated: 30 January, 2011, 13:25 scanf("%d",&b);
printf("Funkcja dla wprowadzonych danych: f(x)=%d",a);
printf("*x+%d\n",b);
float c=a, d=b;
if(a!=0)
}
printf("\nMIEJSCE ZEROWE FUNKCJI
X=%10.2f",-c/d);
{
else {printf("\nBRAK MIEJSC ZEROWYCH\n");}
getch();
return(0);
{
*/
dla printf:
\n - nowa linia
\t - tabulator poziomy
\b - znak cofania
\f - znak nowej strony
\v - tabulator pionowy
\? Znak zapytania
\' znak apostrofu
\" znak cudzysłowu
\ooo liczba ósemkowa
\xhh liczba szesnastkowa
/*
Uczniów pragnących
uzyskać więcej informacji odsyłąmy do licznych kursów
http://lo1.lebork.pl - Liceum Ogólnokształcące Nr 1 w Lęborku - LO 1 Lębork Powered by Mambo Generated: 30 January, 2011, 13:25internetowych. Przyszłym programistom szczególnie polecamy Młodzieżową
Akademię Informatyczną.