Programarea Calculatoarelor 2 - Laborator 7
Scrieți o funcție int myscanf(char *format, void *buf) care citește
o serie de valori conform șirului format dat, și le stochează
una după alta în blocul de memorie de la adresa buf.
Funcția va citi din intrare și va returna o valoare după aceleași reguli
ca și scanf, dar nu va trata decăt specificatori de format
%%, %c, %d, %f și caracterele obișnuite. (Un caracter de tip
spațiu alb în șirul de format specifică consumarea de zero sau mai multe
caractere din intrare, până la primul caracter care nu e spațiu alb.
Orice alt caracter din șirul de format trebuie să se regăsească în intrare.)
Spre deosebire de scanf, care ia un parametru adresă pentru
fiecare câmp de citit, funcția myscanf primește pentru simplitate
o singură adresă buf a unui bloc de memorie (presupus suficient
de mare) în care se vor stoca una după alta valorile citite, fiecare ocupând
numărul de octeți corespunzător tipului.
Precizări:
În programul principal, citiți o linie de format (de maxim 80 de caractere)
și apelați funcția scrisă. Declarați tabloul buf suficient de
mare pentru a putea cuprinde numărul maxim de variabile (octeți) care ar
putea rezulta din șirul de format.
Pentru a scrie valorile, pointerul buf va trebui convertit succesiv
la tipul fiecărei valori citite și incrementat corespunzător.
Dacă de la intrare s-a citit un caracter "în plus" (uneori, sfârșitul
unui câmp poate fi detectat doar la citirea unui caracter care nu
corespunde), acesta poate fi "returnat" în tamponul de intrare cu apelul
ungetc(caracter, stdin) (funcția e declarată în stdio.h).
Acestă funcție nu poate fi apelată de mai multe ori consecutiv fără ca
între timp să se citească cel puțin un caracter din intrare.
Pentru a testa programul, puteți apela funcția
void checkfmt(char *fmt, void *buf, int items) scrisă în acest
scop. Primii doi parametri sunt aceiași ca și pentru myscanf,
iar al treilea este valoarea care a fost returnată de apelul acesteia.
Funcția va tipări pe rând valorile stocate în tamponul buf.
Pentru aceasta, declarați funcția în programul vostru și compilați-l
împreună cu fișierul obiect checkfmt.o al cărui
nume îl adăugați la linia de comandă pentru gcc.
Dacă doriți, puteți implementa suplimentar specificatorul %n.
Marius Minea
Last modified: Wed Nov 12 07:51:52 EET 2003