Printf

Introduzione

Consideriamo un semplice hello world in C

#include <stdio.h>

int main(void) {
  printf("Hello World!\n");
  return 0;
}

La funzione printf è una delle funzioni più utilizzate nel contesto del linguaggio C, in quanto ci permette di stampare stringhe e variabili. La funzione printf lavora con delle format string, che specificano la struttura della stringa che si vuole stampare andando a delineare i luoghi in cui i valori delle variabili sono stampati. Ad esempio se vogliamo stampare un intero procederemo nel seguente modo

#include <stdio.h>

int main(void) {
  int a = 42;
  printf("The answer to everything is %d!\n", a);
  return 0;
}

Quel valore %d è un format identifier che indica che in quello spazio verrà stampata una variabile di tipo intero (int). Una volta eseguito il codice otteniamo

The answer to everything is 42!

La funzione printf è un esempio di funzione variadica. Questo significa che la funzione può avere un numero di argomenti arbitrario. Se dobbiamo stampare una variabile, avrà due argomenti: la format string, e il valore della variabile. Ma se dobbiamo stampare due variabili, avrà tre argomenti: la format string, il valore della prima variabile e il valore della seconda variabile. Questo ragionamento può essere esteso a quantità arbitrarie di variabili, come mostra il seguente codice.

#include <stdio.h>

int main(void) {
  printf("Zero\n");
  printf("One %d\n", 1);
  printf("Two %d, %d\n", 1, 2);
  printf("Three %d, %d, %d\n", 1, 2, 3);
  printf("Four %d, %d, %d, %d\n", 1, 2, 3, 4);
  return 0;
}

Che una volta eseguito stamperà le seguenti stringhe

Zero
One 1
Two 1, 2
Three 1, 2, 3
Four 1, 2, 3, 4

L'obiettivo di questo progetto è di riscrivere la funzione printf da zero, avendo a disposizione il supporto delle funzioni variadiche e l'utilizzo della system call write. Alla fine del progetto avrai una funzione printf custom, chiamata esa_printf, che riuscirà a gestire i seguenti format identifiers:

  • %c per i caratteri (char)
  • %s per le stringhe (char *)
  • %p per i puntatori (void *)
  • %d per gli interi (int)
  • %i per gli interi (int)
  • %u per gli interi senza segno (unsigned int)
  • %x per gli interi in formato esadecimale lowercase (int)
  • %X per gli interi in formato esadecimale uppercase (int)

Il progetto è dedicato a tutti coloro interessati a capire il funzionamento interno della funzione printf.

Struttura del progetto

4 Milestone
~
13 Step