Capitolul 7.4. Intrarea formatata-scanf
:: Programare :: C & C++ :: Capitolul 7
Pagina 1 din 1
Capitolul 7.4. 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 null 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 */
{
double sum, v;
sum=0;
while(scanf("%lf", Dv)!=EOF)
printf("`t%. 2f`n", sum+=v);
}
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);
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 null 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 */
{
double sum, v;
sum=0;
while(scanf("%lf", Dv)!=EOF)
printf("`t%. 2f`n", sum+=v);
}
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);
Subiecte similare
» Capitolul 7.3. Iesirea formatata-printf
» Capitolul 3.5. WHILE si FOR
» Capitolul 3.2.IF-ELSE
» Capitolul 3.3. ELSE-IF
» Capitolul 3.4. Switch
» Capitolul 3.5. WHILE si FOR
» Capitolul 3.2.IF-ELSE
» Capitolul 3.3. ELSE-IF
» Capitolul 3.4. Switch
:: Programare :: C & C++ :: Capitolul 7
Pagina 1 din 1
Permisiunile acestui forum:
Nu puteti raspunde la subiectele acestui forum
|
|