Programarea Calculatoarelor 2 - Laborator 8

Scrieți o funcție int myscanf(char *format, void *buf) care citește de la intrare o serie de valori conform șirului format dat, și le stochează una după alta în memorie începând 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 specificatorii de format %%, %c, %d (fără alți modificatori) ș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), eliminați caracterul final ș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.
Pointerul la care se scriu valorile (inițial buf) va trebui convertit succesiv la tipul fiecărei valori citite și incrementat corespunzător.
În funcția myscanf citirea de la intrare se va face doar cu funcția getchar(). Nu se permite folosirea funcțiilor din familia scanf (de exemplu pentru a citi un întreg).
Dacă de la intrare s-a citit un caracter "în plus" (uneori, sfârșitul unui câmp e 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.
La citirea unui întreg (%d) nu trebuie neapărat să tratați cazul semnului inițial.
Dacă doriți, puteți implementa suplimentar specificatorul %n.
Marius Minea
Last modified: Wed Nov 12 07:51:52 EET 2003