לדלג לתוכן

4.9 - משתני ארגומנטים ומימוש printf - תרגול

תרגיל 1 - המקסימום מבין כמה מספרים

כתוב פונקציה int max_of(int count, ...) שמקבלת מספר שלם count ואחריו count מספרים שלמים, ומחזירה את הגדול מביניהם.

דוגמה להרצה:

max_of(3, 10, 45, 22) = 45
max_of(5, -7, -2, -99, -1, -50) = -1

תרגיל 2 - כתיבת my_printf

כתוב פונקציה void my_printf(const char *fmt, ...) שמתנהגת כמו printf ותומכת בתווי הפורמט הבאים:

  • %d - מספר שלם בבסיס עשרוני (כולל מספרים שליליים)
  • %s - מחרוזת
  • %c - תו בודד
  • %x - מספר שלם בבסיס הקסדצימלי
  • %% - סימן אחוז

אסור להשתמש ב-printf, sprintf או puts בתוך המימוש. הפונקציה היחידה שמותר להשתמש בה לפלט היא putchar.

דוגמה להרצה:

my_printf("hello %s, you are %d years old\n", "dan", 25);
my_printf("hex: %x, char: %c, percent: %%\n", 255, 'A');
hello dan, you are 25 years old
hex: ff, char: A, percent: %

תרגיל 3 - פונקציית לוג עם levelים

כתוב פונקציה void log_msg(const char *level, const char *fmt, ...) שמדפיסה הודעת לוג בפורמט [LEVEL] message, כאשר ההודעה עצמה נתמכת בכל תווי הפורמט של printf הרגיל.

הפונקציה צריכה להוסיף ירידת שורה בסוף בעצמה, כך שהקורא לא צריך לכתוב \n.

כאן מותר (ואף רצוי) להשתמש בספרייה - המטרה היא להבין למה אי אפשר פשוט להעביר את ה-... הלאה, ואיך משפחת ה-v פותרת את זה.

דוגמה להרצה:

log_msg("INFO", "server started on port %d", 8080);
log_msg("ERROR", "cannot open file %s", "config.txt");
log_msg("DEBUG", "%d items, %d%% done", 42, 75);
[INFO] server started on port 8080
[ERROR] cannot open file config.txt
[DEBUG] 42 items, 75% done