File: Stare vježbe/vjezbe08/49__getop.c

  1. /*
  2.   49__getop.c
  3.   Sluzi za "prepoznavanje" prvog slijedeceg operanda (broja) ili operatora u
  4.   ulaznom nizu znakova.
  5. */
  6.  
  7. #include <stdio.h>
  8. #include <ctype.h>
  9. #include "49__kalkulator.h"
  10.  
  11. int getop ( char s[] )
  12. {
  13. int i;
  14. char c;
  15.  
  16. /* prvo preskacemo sva prazna mjesta ili tab-ove na pocetku ucitanog
  17.   niza znakova (iz kojeg znak po znak dobivamo pomocu getc()) */
  18. while ((s[0] = c = getc(stdin)) == ' ' || c == '\t');
  19.  
  20. /* sad u s[0] pise prvi znak koji nije praznina
  21.   pretpostavimo za pocetak da je to jedini znak (tj. rijec je o
  22.   operatoru, npr. '+' ili '*') */
  23. s[1] = '\0';
  24.  
  25. /* ako trenutni znak (c, tj. s[0]) nije znamenka ili dec. tocka,
  26.   zakljucujemo da je zaista rijec o operatoru */
  27. if (!isdigit(c) && c != '.')
  28. return c;
  29.  
  30. /* na ovom mjestu znamo da je rijec o broju, tj. operandu
  31.   i ocitavamo znamenku po znamenku, koje spremamo u s */
  32. i = 0;
  33. if (isdigit(c))
  34. while (isdigit(s[++i] = c = getc(stdin)));
  35.  
  36. /* moramo paziti i na eventualnu decimalnu tocku */
  37. if (c == '.')
  38. while (isdigit(s[++i] = c = getc(stdin)));
  39.  
  40. /* na kraj stringa stavljamo '\0' */
  41. s[i] = '\0';
  42.  
  43. /* ako nakon sto smo zavrsili sa "prepoznavanjem" broja nismo dosli do
  44.   kraja ucitanog niza znakova, ocitali smo iz buffer-a jedan znak viska
  45.   koji priprada iducem operatoru/operandu -- moramo ga vratiti u buffer
  46.   pomocu ungetc() */
  47. if (c != EOF)
  48. ungetc(c, stdin);
  49.  
  50. return BROJ;
  51. }
  52.