Intrarea formatata-scanf
Functia scanf este intrarea analog printf-iesirea, admitind
aceleasi conversii in sens invers.
scanf(control, arg1, arg2,...)
scanf citeste caractere de la intrarea standard, le
interpreteaza conform formatului specificat in "control" si
memoreaza rezultatele in celelalte argumente, care sint pointere
ce indica unde vor fi depuse datele convertite.
Sirul de "control" contine de obiecei specificatii de
conversie, care sint utilizate pentru o interpretare directa
a secventelor de intrare. Sirul de control poate sa contina:
-blancuri, taburi, newlines" care sint ignorate (sint
numite "caractere albe")
-caractere ordinare (nu%)
-specificatii de conversie continind caracterul % si
optional caracterul de suprimare, un numar optional de
specificare a lungimii maxime a cimpului si un caracter
de conversie
O specificatie de conversie determina conversia urmatorului
cimp de intrare. Normal rezultatul este plasat in
variabila pointata de argumentul corespunzator. Daca se
indica suprimarea prin caracterul * oricum cimpul de la intrare
este ignorat 9se sare peste el) si nu se face nici o
retinere de spatiu. Un cimp de la intrare este definit ca un sir
de non "caracter alb " fie pina la lungimea specificata a
cimpului.
Caracterul de conversie indica interpretarea cimpului de la
intrare argumentul corespunzator trebuie sa fie un pointer asa
cum este cerut de semantica "C" limbajului "C". Urmatoarele
caractere de conversie sint legale:
d-un intreg zecimal este asteptat la intrare ;argumentul
corespunzator trebuie sa nu fie pointer intreg.
o-un intrteg octal este asteptat la intrare ;argumentul
corespunzator trebuie sa fie un pointer de intreg.
x-un intreg hexazecimal este asteptat la intrare ;
argumentul corespunzator trebuie sa fie un pointer de
intreg.
h-un intreg "short" este asteptat la intrare: argumentul
trebuie sa fie un pointer de intreg "short" ("scurt").
c-un singur caracter este asteptat ; argumentul
corespunzator trebuie sa fie un piinter de caracter. In
acest caz ignorarea "caracterelor albe " este suprimata ;
pentru a citi urmatoreul caracter altul de cit
"caracterele albe" se foloseste %1s.
s-un sir de caractere este asteptat ; argumentul
corespunzator trebuie sa fie un pointer al unui tablou de
caractere destul de mare pentru a incapea sirul si nun
terminator `0 care va fi adaugat.
f-un numar in virgula flotanta este asteptat
; argumentul corespunzator trebuie sa fie un pointer la
un cimp "float". Un caracter de conversie e este
sinonim cu f. Formatul prezentat la intrare pentru un
"float" este alcatuit dintr-un semn optional, un sir de
numere care pot sa contina si un punct zecimal si un
cimp de exponent care este format din E sau e urmat
de un intreg cu semn.
Caracterele de conversie d, v si x pot fi precedate de litera l
pentru a indica un pointer la "long" mai gdegraba decit
"int" care apare in list ta de argumente. Similar litera l
inainte de E sau f indica un pointer la "double" in lista de
argumente.
De exemplu:
int i;
float x;
char name[50];
scanf("%d%f%s", Di, Dx, name);
cu linia de intrare
25 54. 32E-1 Thompson
va asigna valoarea 25 lui i, 5. 432 luix si plaseaza sirul
"Thompson" terminat prin `0in "name". Cele trei cimpuri de la
intrare pot fi separate de orice blancuri, tab-uri si newline-uri.
Apelarea:
int i;
float x;
char name[50];
scanf("%2d%f%*d%2s, Di, Dx, name);
cu intrarea
56789 0123 45a72
va asigna lui i, 789. 0 lui x, va sari peste 0123 si plaseaza
"45" in "name". Urmatoarea apelare la orice rutina de introducere
va incepe cautarea cu litera a. In aceste doua exemple "name"
este deja un pointer si de aceea nu trebuie precedat de D.
Ca un alt exemplu, calculul rudimentar de la capitolul 4 poate fi
acum rescris cu scanf pentru a face conversia de intrare.
#include<stdio.h>
main() /* rudimentary desk calculator */
scanf se popreste cind se epuzeaza sirul de control ori cind
data de intrare difera prea mult de specificatia de control. Este
returnata o valoare egala cu numarul de date de intrare
introduse cu succes. La sfirsitul fisierului este returnat EOF ;
de observat ca acesta este diferit de 0 , ceea ce inseamna ca
urmatorul caracter de la intrare nu se mai converteste prin prima
specificatie din sirul de control. Urmatorul apel la scanf se
rezuma sa caute imediat dupa ultimul caracter deja returnat.
Un avertisment final: argumentele lui scanf trebuie sa fie
pointeri. De departe cea maiobisnuita eroare este sa scrii
scanf("%d", n);
in loc de
scanf("%d", Dn);