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