Metode evoluate de programare Limbajele c şi C++



Yüklə 1,64 Mb.
səhifə9/44
tarix07.04.2018
ölçüsü1,64 Mb.
#46828
1   ...   5   6   7   8   9   10   11   12   ...   44

4.2. Funcţia standard scanf



Funcţia de bibliotecă scanf realizează intrări cu format de la intrarea standard stdin (intrare de la terminalul de la care s-a lansat programul) şi poate fi apelată printr-o instrucţiune de apel de forma:

scanf (control, lista_adrese);



Ca şi în cazul funcţiei printf, parametrul control este delimitat de ghilimele şi poate conţine texte şi specificatori de format. Caracterele albe din parametrul control sunt neglijate. Celelalte caractere care nu fac parte dintr-un specificator de format, trebuie să existe la intrare în poziţii corespunzătoare. Ele se folosesc în scopul realizării unor verificări asupra datelor care se citesc.

Un specificator de format începe şi în acest caz prin caracterul procent, apoi:



  1. un caracter “*” opţional;

  2. un şir de cifre, opţional, care defineşte lungimea maximă a câmpului din care se citeşte data de sub controlul specificatorului de format;

  3. una sau două 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 şi se termină:

  1. fie la caracterul după care urmează un caracter alb;

  2. fie la caracterul după care urmează un caracter care nu corespunde specificatorului de format care controlează acel câmp;

  3. fie la caracterul prin care se ajunge la lungimea maximă indicată în specificatorul de format.

Condiţia c) este absentă în definirea câmpului dacă în specificatorul de format nu este indicată lungimea maximă a câmpului.

Literele care termină un specificator de format sunt asemănătoare cu cele utilizate la funcţia printf. În acest caz este realizată conversia inversă faţă de cea realizată de funcţia printf.
Litera Tipul conversiei realizate
d - data din câmpul de intrare este un şir de cifre zecimale, precedat eventual de un semn şi se converteşte din zecimal extern în binar de tip int

  1. - ca şi în cazul literei d, dar din octal extern în binar de tip int.

x - ca şi în cazul literei d, dar din hexazecimal extern în binar de tip int; se utilizează literele mici a-f sau mari A-F pentru cifrele mai mari ca 9.

X - ca şi în cazul literei x;

u - data este un şir de cifre zecimale care formează un număr întreg fără semn şi se converteşte din zecimal extern în binar tipul unsigned.

c - data se consideră formată din caracterul curent de la intrare şi parametrului corespunzător i se atribuie codul ASCII al acestui caracter; în acest caz nu se face avans peste caracterele albe, ca şi în cazul celorlalţi specificatori.

s - data se consideră că este şir de caractere; şirul începe, conform regulii generale, cu primul caracter care nu este alb şi se termină la caracterul după care urmează un caracter alb sau când s-au citit atâtea caractere câte indică dimensiunea maximă din specificatorul de format;

f - data de intrare reprezintă un număr flotant; deci conversie din flotant extern în virgulă flotantă simplă precizie; data care se citeşte conţine un punct sau un exponent, sau atât punct cât şi exponent.


Literele d, o, x şi u pot fi precedate de litera l şi în acest caz conversia se realizează spre long, în loc de int.

De asemenea, litera f va fi precedată de litera l pentru a face conversii spre formatul virgulă flotantă dublă precizie.

Lista_adrese conţine adresele zonelor receptoare ale datelor citite prin intermediul funcţiei scanf. Fiecare dintre parametri reprezintă adresa unei zone receptoare sub forma:
&nume
Ea determină adresa zonei de memorie rezervată variabilei nume. Caracterul “&” din construcţia de mai sus reprezintă un operator unar, numit operatorul adresă. El are aceeaşi prioritate ca şi ceilalţi operatori unari din limbajul C.
Exemplu:
void main (void)

{ int i;


long n;

float x;


scanf (“ %d %ld %f ”,&i,&n,&x); // citeste datele din stdin si le atribuie lui i,n,x.

scanf(“ %d %*ld %f “, &i,&x); // caracterul * indica faptul ca valoarea pentru variabila n

// nu se citeste

}
Funcţia scanf returnează numărul de câmpuri citite corect din fişierul stdin. Dacă apare o eroare la citire (din diverse motive de exemplu neconcordanţă dintre specificatorul de format şi datele din fişierul stdin) atunci funcţia nu va returna numărul total de câmpuri; citirea se va întrerupe în locul detectării erorii şi scanf va returna numărul de câmpuri citite până în acel moment. Deci de multe ori pentru a valida formal intrarea datelor (atenţie nu e o validare calitativă) se va folosi o construcţie de forma:


nr=scanf(...)
Prin construcţia de mai sus se poate pune în evidenţă sfârşitul de fişier, deoarece în acest caz scanf returnează valoarea EOF. Sfârşitul de fişier se poate genera de la tastatură acţionând în acelaşi timp tastele CTRL şi Z (deci CTRL / Z). Deorece funcţia scanf citeşte datele de la intrarea standard prin intermediul unei zone de memorie intermediare (numită zonă tampon sau buffer), ea are acces la caracterele din zona tampon numai după acţionarea tastei ENTER (RETURN). De aceea după acţionarea combinaţiei CTRL / Z se va tasta şi ENTER. Totodată această intermediere face posibilă eventuale corecturi înainte de a acţiona tasta ENTER.
Exemplu:

Vom citi un întreg de cinci cifre de la intrarea standard şi vom afişa cifrele respective precedate fiecare de două spaţii.


void main (void)

{ int c1,c2,c3,c4,c5; // c1,c2,c3,c4,c5 sunt cifrele intregului citit

scanf(“%1d %1d %1d %1d %1d”, &c1,&c2,&c3,&c4,&c5);

// se citesc cifrele intregului in cele 5 variabile cu %1d

printf(“%3d%3d%3d%3d%3d”,c1,c2,c3,c4,c5);

}
Pentru a citi şiruri de caractere se va folosi funcţia scanf fără a mai pune operatorul de adresă în faţa numelui şirului de caractere, deoarece numele unui tablou reprezintă un pointer (deci conţine o adresă şi anume adresa primului element de tablou).

Exemplu:

Vom citi numele şi prenumele unei persoane şi le afişăm pe ecran.


#define MAX 20

void main(void)

{ char nume[MAX+1], prenume[MAX+1]; //declararea tablourilor de caractere

scanf (“%20s %20s”,nume, prenume); //nu s-a mai pus operatorul de adresa

printf (“\nnumele: %s, prenumele: %s”,nume,prenume);

}



Yüklə 1,64 Mb.

Dostları ilə paylaş:
1   ...   5   6   7   8   9   10   11   12   ...   44




Verilənlər bazası müəlliflik hüququ ilə müdafiə olunur ©muhaz.org 2024
rəhbərliyinə müraciət

gir | qeydiyyatdan keç
    Ana səhifə


yükləyin