printf

stdio.h, cstdio

int printf(const char *format, ...);

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
e, E, f, g, G

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ą.