CATEGORII DOCUMENTE |
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 in 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 in pozitii corespunzatoare. Ele se folosesc in scopul realizarii unor verificari asupra datelor care se citesc.
Un specificator de format incepe si in acest caz prin caracterul procent, apoi:
un caracter "*" optional;
un sir de cifre, optional, care defineste lungimea maxima a campului din care se citeste data de sub controlul specificatorului de format;
una sau doua litere care definesc tipul conversiei din formatul extern in formatul intern.
Campul controlat de un specificator de format incepe cu primul caracter care nu este alb si se termina:
a) fie la caracterul dupa care urmeaza un caracter alb;
b) fie la caracterul dupa care urmeaza un caracter care nu corespunde specificatorului de format care controleaza acel camp;
c) fie la caracterul prin care se ajunge la lungimea maxima indicata in specificatorul de format.
Conditia c) este absenta in definirea campului daca in specificatorul de format nu este indicata lungimea maxima a campului.
Literele care termina un specificator de format sunt asemanatoare cu cele utilizate la functia printf. In acest caz este realizata conversia inversa fata de cea realizata de functia printf
Litera Tipul conversiei realizate
d - data din campul de intrare este un sir de cifre zecimale, precedat eventual de un semn si se converteste din zecimal extern in binar de tip int
- ca si in cazul literei d, dar din octal extern in binar de tip int.
x - ca si in cazul literei d, dar din hexazecimal extern in binar de tip int; se utilizeaza literele mici a-f sau mari A-F pentru cifrele mai mari ca 9.
X - ca si in cazul literei x;
u - data este un sir de cifre zecimale care formeaza un numar intreg fara semn si se converteste din zecimal extern in 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; in acest caz nu se face avans peste caracterele albe, ca si in cazul celorlalti specificatori.
s - data se considera ca este sir de caractere; sirul incepe, conform regulii generale, cu primul caracter care nu este alb si se termina la caracterul dupa care urmeaza un caracter alb sau cand s-au citit atatea caractere cate indica dimensiunea maxima din specificatorul de format;
f - data de intrare reprezinta un numar flotant; deci conversie din flotant extern in virgula flotanta simpla precizie; data care se citeste contine un punct sau un exponent, sau atat punct cat si exponent.
Literele d, o, x si u pot fi precedate de litera l si in acest caz conversia se realizeaza spre long, in 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 campuri 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 campuri; citirea se va intrerupe in locul detectarii erorii si scanf va returna numarul de campuri citite pana in 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 in evidenta sfarsitul de fisier, deoarece in acest caz scanf returneaza valoarea EOF. Sfarsitul de fisier se poate genera de la tastatura actionand in 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 inainte de a actiona tasta ENTER.
Exemplu:
Vom citi un intreg 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 in 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)
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 749
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved