File: Stare vježbe/vjezbe13/84__ellipsis.c

  1. /*
  2.   84__ellipsis.c
  3.   -----
  4.   Program demonstrira upotrebu ... (ellipsis) notacije za implementaciju
  5.   funkcija koje primaju proizvoljan broj argumenata (poput primjerice
  6.   funkcija printf i scanf).
  7. */
  8.  
  9. #include <stdio.h>
  10. #include <stdarg.h>
  11.  
  12. char *poruke[4]={
  13. "",
  14. "Datoteka %s ne postoji u direktoriju %s!",
  15. "%d: nedozvoljena vrijednost!",
  16. "Datoteka %s: linija %d -> %s: nedozvoljeni simbol!"
  17. };
  18.  
  19. /* Napomena: U deklaraciji funkcije mora postojati barem 1 imenovani argument.
  20.   ... se moze nalaziti samo na kraju */
  21. void ispis(int n, ...) {
  22. int i; char *p, *s;
  23.  
  24. va_list argp;
  25. /* kao drugi argument funkcije va_start navodi se neposredni
  26.   prethodnik liste varijabilnih argumenata */
  27. va_start(argp, n);
  28.  
  29. for(p=poruke[n]; *p; p++) {
  30. if (*p!='%') {
  31. putchar(*p);
  32. continue;
  33. }
  34. switch(*++p) {
  35. case 'd':
  36. /* va_arg vraca trenutni argument i inkrementira argp na iduceg */
  37. i=va_arg(argp, int);
  38. printf("%d", i);
  39. break;
  40. case 's':
  41. /* va_arg vraca trenutni argument i inkrementira argp na iduceg */
  42. s=va_arg(argp, char*);
  43. printf("%s", s);
  44. break;
  45. default: putchar(*p);
  46. }
  47. }
  48. printf("\n");
  49. /* na kraju resetiramo argp */
  50. va_end(argp);
  51. }
  52.  
  53. int main() {
  54. ispis(1, "source.c", "/windows");
  55. ispis(2, 314);
  56. ispis(3, "datoteka.c", 13, "medvjedici");
  57.  
  58. return 0;
  59. }
  60.