ALTE DOCUMENTE
|
|||||||||
INTRĂRI / IEsIRI STANDARD
Limbajul C nu poseda instructiuni de intrare / iesire. Aceste operatii se realizeaza prin apeluri de functii din bibliotecile standard ale mediului de programare. De obicei astfel de functii asigura interfata programului cu terminalul de la care s-a lansat, cu imprimanta, etc. Se numesc intrari standard si iesiri standard intrarile respectiv iesirile de la terminalul de la care s-a lansat programul. Totodata se presupune ca datele de intrare / iesire sunt organizate în fisier 444d31e e.
Unui program C i se ataseaza în mod implicit urmatoarele fisiere:
- stdin intrare standard;
- stdout iesire standard;
- stderr iesire standard pentru erori;
- stdprn iesire pe imprimanta;
- stdaux intrare / iesire seriala.
4.1. FUNCŢIA STANDARD printf
Functia printf realizeaza iesiri cu format la iesirea standard stdout, deci afisare la terminalul la care care s-a lansat programul. Functia printf se apeleaza printr-o instructiune cu formatul:
int printf (control, lista_expresii);
unde control este un sir de caractere care contine:
texte de scris;
specificatori de format pentru datele care se scriu din lista_expresii.
lista_expresii contine expresii; valoarea fiecarei expresii se scrie conform unui specificator de format corespondent din parametrul control.
Parametrul control este inclus între ghilimele, iar numarul specificatorilor de format coincide cu numarul expresiilor din lista_expresii. Daca dorim sa scriem numai un text atunci parametrul de control nu contine nici un specificator de format iar lista_expresii este vida (practic este absenta).
Un specificator de format are formatul BNF urmator:
%[-][d..d][.d..d][l1]l2
Dupa cum se observa un specificator de format începe întotdeauna cu caracterul procent ("%"). Dupa acest caracter poate urma una din constructiile urmatoare:
- un caracter "-" optional; prezenta acestui caracter indica cadrarea la stânga a datei în câmpul în care se scrie (implicit data se scrie cadrata la dreapta);
-un sir de cifre zecimale optional, care defineste lungimea minima a câmpului în care se scrie data corespunzatoare din lista_expresii; data se scrie astfel:
în cazul în care necesita o lungime mai mica se scrie cadrata la dreapta sau stânga (în functie de absenta sau prezenta semnului "-")
în cazul în care necesita o lungime mai mare se va scrie pe atâtea pozitii câte îi sunt necesare;
-un punct urmat de un sir de cifre zecimale (dupa cum se observa optional); acest element indica precizia datei care se scrie:
daca data se scrie în virgula flotanta, precizia defineste numarul de cifre aflate dupa marca zecimala (deci câte zecimale);
daca data este un sir de caractere atunci indica câte caractere se scriu.
-una sau doua litere, care definesc tipul de conversie din formatul intern în formatul extern:
prima litera poate fi "l", ceea ce semnifica conversia din formatul intern long în formatul extern definit de specificator;
a doua litera este obligatorie întotdeauna si are semnificatiile de mai jos:
litera tipul
de conversie realizat
d - din int intern în zecimal extern
o - din int intern în octal extern
x - din int intern în hexazecimal extern (litere mici pentru cifrele mai mari ca 9 deci a,b,c,d,e,f,)
X - din int intern în hexazecimal extern (litere mici pentru cifrele mai mari ca 9 deci A,B,C,D,E,F)
u - din unsigned intern în zecimal extern fara semn
c - din binar intern (cod ASCII) în caracterul corespunzator
s - din sir de coduri ASCII într-un sir de caractere (atentie
ultimul cod este NUL (adica '\0')
f - din float sau double intern în d...d.d...d (implicit 6 cifre
zecimale la partea fractionara daca nu e prezenta precizia)
e - din float sau double intern în d.d...de±ddd (implicit 6
cifre zecimale la partea fractionara daca nu e prezenta
precizia)
E - din float sau double intern în d.d...dE±ddd (implicit 6
cifre zecimale la partea fractionara daca nu e prezenta
precizia)
g - se aplica una din conversiile definite de literele f si e
alegându-se aceea care are un numar minim de pozitii
G - se aplica una din conversiile definite de literele f si E
alegându-se aceea care are un numar minim de pozitii
Literele d, o, x, u pot fi precedate de litera l conversia realizându-se din formatul intern long în loc de int.
Observatie.
1o. Daca caracterul % nu este urmat de una din constructiile de mai sus atunci nu reprezinta un specificator de format.
Functia printf întoarce lungimea totala în octeti a datelor scrise la terminal sau valoarea simbolica EOF în caz de eroare. Precizam ca EOF este definita în fisierul header stdio.h astfel:
#define EOF -1.
Totodata functia printf poate fi testata si astfel:
EOF= = printf (control, lista_expresii)
Daca are valoarea adevarat atunci la scrierea datelor s-a produs o eroare.
Exemple:
#include<stdio.h>
#include<math.h>
void main(void)
Rezultatele execu iei programului sunt:
i*j = 110
i*j = 110
i*j = 110
i*j = 00110
i*j = 00110
a*b = 1.6
A*B = 2.10000
radical(a*b) = 1.249000
radical(A*B) = 1.4491376746
radical(A*B) = 1.44913767461894372
radical(A*B) = 1.4491376746189437200
#define sir "PC WORLD"
void main (void)
Rezultatele executiei programului sunt:
* PC WORLD*
*PC WORLD *
* PC WO*
*PC WO *
4.2. FUNCŢIA STANDARD scanf
Functia de biblioteca scanf realizeaza intrari cu format de la intrarea standard stdin (intrare de la terminalul de la care s-a lansat programul) si poate fi apelata printr-o instructiune de apel de forma:
scanf (control, lista_adrese);
Ca si în cazul functiei printf, parametrul control este delimitat de ghilimele si poate contine texte si specificatori de format. Caracterele albe din parametrul control sunt neglijate. Celelalte caractere care nu fac parte dintr-un specificator de format, trebuie sa existe la intrare în pozitii corespunzatoare. Ele se folosesc în scopul realizarii unor verificari asupra datelor care se citesc.
Un specificator de format începe si în acest caz prin caracterul procent, apoi:
un caracter "*" optional;
un sir de cifre, optional, care defineste lungimea maxima a câmpului din care se citeste data de sub controlul specificatorului de format;
una sau doua litere care definesc tipul conversiei din formatul extern în formatul intern.
Câmpul controlat de un specificator de format începe cu primul caracter care nu este alb si se termina:
fie la caracterul dupa care urmeaza un caracter alb;
fie la caracterul dupa care urmeaza un caracter care nu corespunde specificatorului de format care controleaza acel câmp;
fie la caracterul prin care se ajunge la lungimea maxima indicata în specificatorul de format.
Conditia c) este absenta în definirea câmpului daca în specificatorul de format nu este indicata lungimea maxima a câmpului.
Literele care termina un specificator de format sunt asemanatoare cu cele utilizate la functia printf. În acest caz este realizata conversia inversa fata de cea realizata de functia printf.
Litera Tipul conversiei realizate
d - data din câmpul de intrare este un sir de cifre zecimale, precedat eventual de un semn si se converteste din zecimal extern în binar de tip int
- ca si în cazul literei d, dar din octal extern în binar de tip int.
x - ca si în cazul literei d, dar din hexazecimal extern în binar de tip int; se utilizeaza literele mici a-f sau mari A-F pentru cifrele mai mari ca 9.
X - ca si în cazul literei x;
u - data este un sir de cifre zecimale care formeaza un numar întreg fara semn si se converteste din zecimal extern în binar tipul unsigned.
c - data se considera formata din caracterul curent de la intrare si parametrului corespunzator i se atribuie codul ASCII al acestui caracter; în acest caz nu se face avans peste caracterele albe, ca si în cazul celorlalti specificatori.
s - data se considera ca este sir de caractere; sirul începe, conform regulii generale, cu primul caracter care nu este alb si se termina la caracterul dupa care urmeaza un caracter alb sau când s-au citit atâtea caractere câte indica dimensiunea maxima din specificatorul de format;
f - data de intrare reprezinta un numar flotant; deci conversie din flotant extern în virgula flotanta simpla precizie; data care se citeste contine un punct sau un exponent, sau atât punct cât si exponent.
Literele d, o, x si u pot fi precedate de litera l si în acest caz conversia se realizeaza spre long, în loc de int.
De asemenea, litera f va fi precedata de litera l pentru a face conversii spre formatul virgula flotanta dubla precizie.
Lista_adrese contine adresele zonelor receptoare ale datelor citite prin intermediul functiei scanf. Fiecare dintre parametri reprezinta adresa unei zone receptoare sub forma:
&nume
Ea determina adresa zonei de memorie rezervata variabilei nume. Caracterul "&" din constructia de mai sus reprezinta un operator unar, numit operatorul adresa. El are aceeasi prioritate ca si ceilalti operatori unari din limbajul C.
Exemplu:
void main (void)
Functia scanf returneaza numarul de câmpuri citite corect din fisierul stdin. Daca apare o eroare la citire (din diverse motive de exemplu neconcordanta dintre specificatorul de format si datele din fisierul stdin) atunci functia nu va returna numarul total de câmpuri; citirea se va întrerupe în locul detectarii erorii si scanf va returna numarul de câmpuri citite pâna în acel moment. Deci de multe ori pentru a valida formal intrarea datelor (atentie nu e o validare calitativa) se va folosi o constructie de forma:
nr=scanf(...)
Prin constructia de mai sus se poate pune în evidenta sfârsitul de fisier, deoarece în acest caz scanf returneaza valoarea EOF. Sfârsitul de fisier se poate genera de la tastatura actionând în acelasi timp tastele CTRL si Z (deci CTRL / Z). Deorece functia scanf citeste datele de la intrarea standard prin intermediul unei zone de memorie intermediare (numita zona tampon sau buffer), ea are acces la caracterele din zona tampon numai dupa actionarea tastei ENTER (RETURN). De aceea dupa actionarea combinatiei CTRL / Z se va tasta si ENTER. Totodata aceasta intermediere face posibila eventuale corecturi înainte de a actiona tasta ENTER.
Exemplu:
Vom citi un întreg de cinci cifre de la intrarea standard si vom afisa cifrele respective precedate fiecare de doua spatii.
void main (void)
Pentru a citi siruri de caractere se va folosi functia scanf fara a mai pune operatorul de adresa în fata numelui sirului de caractere, deoarece numele unui tablou reprezinta un pointer (deci contine o adresa si anume adresa primului element de tablou).
Exemplu:
Vom citi numele si prenumele unei persoane si le afisam pe ecran.
#define MAX 20
void main(void)
4.3. FUNCŢIA STANDARD putchar
Functia standard putchar se poate utiliza pentru a scrie un caracter în fisierul standard de iesire stdout, în pozitia curenta a cursorului. Ea se apeleaza folosind o instructiune de apel de forma:
putchar (expresie);
unde expresie este codul ASCII al caracterului care se scrie la iesirea standard.
Practic putchar nu este o functie în sensul definitiei ce am dat-o în lectia 1, ci este un macrou definit în fisierul header stdio.h, care foloseste o functie speciala destinata prelucrarii fisierelor, functia putc, astfel:
#define putchar(c) putc(c,stdout)
Exemplu:
void main (void)
4.4. FUNCŢIA STANDARD getchar
Aceasta functie citeste de la intrarea standard, stdin, caracterul curent si returneaza codul ASCII al caracterului citit. Tipul valorii returnate este int. La întâlnirea sfârsitului de fisier (CTRL/Z) se returneaza valoarea EOF (adica -1). Ca si putchar, getchar este un macrou definit în fisierul header stdio.h, cu ajutorul unei functii speciale, getc destinate prelucrarii fisierelor, astfel:
#define getchar() getc(stdin)
De obicei getchar se foloseste în expresii de atribuire de forma:
c=getchar();
Dupa citirea caracterului curent de la intrarea standard se atribuie variabilei c codul ASCII al caracterului cititi sau EOF la întâlnirea sfârsitului de fisier.
Exemple:
#include <stdio.h>
void main (void)
2) exemplul urmator testeaza daca s-a citit o litera mare si numai în acest caz aplica transformarea ei în litera mica. În cazul în care la intrare nu se afla o litera mare se rescrie caracterul respectiv.
#include <stdio.h>
void main (void)
4.5. FUNCŢIILE STANDARD getche sI getch
Functia getche citeste de la intrarea standard caracterul curent si returneaza codul ASCII al caracterului citit. Aceasta functie are acces direct la caracter dupa ce a fost tastat si are forma:
getche();
Functia getch este similara cu getche cu singura conditie ca citirea se face fara ecou (deci caracterul tastat nu se reafiseaza pe terminal). De fapt prezenta/absenta sufixului e precizeaza ca functia e sau nu cu ecou. Cele doua functii fac citiri fara intermedierea zonei tampon.
|