2.6. Functia scanf

2019/01/09 in Programare in C

Functia scanf poate fi folosita pentru a introduce date tastate la terminalul standard sub controlul unor formate. Ea poate fi apelata printr-o constructie de forma:

scanf(control, par1, par2,..., parn);

unde:

control - Este un sir de caractere care defineste formatele datelor si a eventualelor texte care se introduc de la tastatura;
par1, par2,..., parn - Sunt adresele zonelor in care se pastreaza datele citite dupa ce au fost convertite din formatele lor externe in formate interne corespunzatoare.

Caracterele albe din compunerea parametrului control sunt neglijate. Restul caracterelor, care nu fac parte dintr-un specificator de format, trebuie sa existe la intrare in pozitii corespunzatoare. Acestea se folosesc in vederea efectuarii de controale asupra datelor citite.

De exemplu, daca o data care se citeste i se atribuie variabilei x, atunci data respectiva poate fi precedata de textul:

x=

In aest caz parametrul trebuie sa contina in pozitia corespunzatoare:

x=specificatorul de format al datei care se citeste

Textele de la intrare pot fi precedate de spatii albe care se neglijeaza.

Specificatorii de format controleaza introducerea datelor care au diferite formate externe reprezentate prin anumite succesiuni de caractere. De asemenea, specificatorii de format definesc conversiile din formate externe ale datelor in formate interne.

Specificatorii de format sunt asemanatori cu cei intalniti la functia printf. Ei incep cu un caracter procent si se termina cu 1-2 litere. Literele definesc tipul conversiei.

Intre procent si litere, intr-un specificator de format mai putem utiliza, in ordine:

Campul controlat de un specificator de format incepe cu primul caracter curent care nu este alb si se termina:

  1. fie la caracterul care urmeaza dupa un spatiu alb;
  2. fie la caracterul prin care se ajunge la lungimea maxima a campului, indicata in specificatorul de format;
  3. fie la caracterul dupa care urmeaza un caracter alb care nu corespunde specificatorul de format care controleaza acel camp;

Conditia 3 este absenta daca in specificatorul de format nu este indicata lungimea maxima a campului.

Observatie: Aceasta regula nu se aplica la citirea de caractere.

In cazul in care specificatorul de format contine caracterul asterisc, data din campul respectiv va fi prezenta la intrare, dar ea nu se atribuie niciunei variabile si deci nu-i va corespunde niciun parametru, spre deosebire de ceilalti specificatori care nu contin caracterul asterisc.

Functia scanf citeste toate campurile care corespund specificatorilor de format, inclusiv eventualele texte prezente in parametrul control.

In cazul unei erori, citirea se intrerupe in locul in care s-a intalnit eroarea. Eroarea poate proveni:

Aparitia unei erori poate fi pusa usor in evidenta deoarece scanf returneaza, la revenirea din ea, numarul campurilor citite corect. In felul acesta, valoarea returnata de scanf poate fi testata si se poate stabili cate campuri au fost citite la fiecare apel al functiei scanf.

Functia scanf citeste date din zona tampon atasata tastaturii, la fel ca si getchar. De aceea, datele se citesc efectiv dupa ce s-a actionat tasta Enter.

Functia scanf, la fel ca si functia printf are prototipul in fisierul stdio.h.

Parametrii par1, par2,..., parn sunt adresele zonelor de memorie in care se pastreaza datele citite la tastatura in urma conversiilor in format intern. Adresa unei zone de memorie se reprezinta adesea folosind operatorul unar &.

Asa de exemplu, daca i este o variabila simpla oarecare, atunci:

&i

reprezinta adresa zonei de memorie alocata variabilei i.

In general, daca nume este este numele unei variabile simple, atunci adresa de inceput a zonei de memorie alocata variabilei nume se exprima cu ajutorul expresiei:

&nume

Observatie: Daca nume este numele unui tablou, atunci nu vom mai folosi operatorul &, deoarece in acest caz nume are ca valoare chiar adresa de inceput a zonei de memorie alocata tabloului respectiv.

2.6.1. Functia scanf - Litera c