Capitolul 7.4. Intrarea formatata-scanf

Vezi subiectul anterior Vezi subiectul urmator In jos

Capitolul 7.4. Intrarea formatata-scanf

Mesaj  zooky la data de Mier Mar 18, 2009 2:34 pm

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);
avatar
zooky
Moderator
Moderator

Numarul mesajelor : 147
Data de inscriere : 15/03/2009
Varsta : 24
Localizare : Cernatesti City

Vezi profilul utilizatorului http://e-learning.forumhit.ro

Sus In jos

Vezi subiectul anterior Vezi subiectul urmator Sus


 
Permisiunile acestui forum:
Nu puteti raspunde la subiectele acestui forum