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