Personalmente ho optato per una soluzione diversa nella quale, anziché ricorrere alle conversioni di libreria di stdio.h e a una funzione "personalizzata" che si occupa solo della conversione in binario, ho usato una funzione "generica" per convertire un valore int qualsiasi in un sistema di numerazione a base qualsiasi (purché compresa tra 2 e 36, dove 36 e' il massimo delle cifre disponibili usando solo i caratteri alfanumerici). Ho previsto per il valore int una dimensione fino a un massimo di 64 bit, ma è facile modificare la funzione per adattarla a dimensioni maggiori.
Non che sia meglio o peggio, però a me è venuta in mente così.
#include <stdio.h>
#include <string.h>
#define RIGA_VERT 179
const char *int2str( int n, int base );
int main() {
int n;
printf( " %c ESADECIMALE %c DECIMALE %c OTTALE %c BINARIO %c\n",
RIGA_VERT, RIGA_VERT, RIGA_VERT, RIGA_VERT, RIGA_VERT );
for( n=1; n<=256; ++n ) {
printf( " %c%8s ", RIGA_VERT, int2str(n,16) );
printf( " %c%7s ", RIGA_VERT, int2str(n,10) );
printf( " %c%6s ", RIGA_VERT, int2str(n, 8) );
printf( " %c%10s ", RIGA_VERT, int2str(n, 2) );
printf( "%c\n", RIGA_VERT );
}
return 0;
}
/*==============================================================================
Converte il valore intero n nella sua rappresentazione in forma di stringa,
secondo la base di numerazione specificata tramite il parametro base.
Ammette basi di numerazione comprese tra 2 e 36 e dimensioni del tipo int fino
a 64 bit.
Se tutto va a buon fine restituisce il puntatore ad uno spazio di memoria
statica che contiene la stringa risultante dalla conversione.
Se viene passata una base di numerazione esterna ai limiti previsti restituisce
il puntatore ad uno spazio di memoria statica che contiene la stringa "(base non
valida)".
Se il tipo int ha dimensioni maggiori di 64 bit restituisce il puntatore ad uno
spazio di memoria statica che contiene la stringa "(dimensioni tipo int
eccessive)".
==============================================================================*/
const char *int2str( int n, int base ) {
static const char kCifre[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
static char s[72] = ""; // contiene allegramente un binario fino a 64 bit
if( (base>1&&base<37) && (sizeof(int)*8<=64) ) {
int negativo = n<0; // memorizza il segno
int i, j;
n = negativo ? -n : n; // valore assoluto
// imposta la stringa secondo la base di numerazione indicata
// (viene inizialmente creata con le cifre "all'indietro")
for( i=0; n>0; ++i ) {
s[i] = kCifre[n%base];
n /= base;
}
// appone il segno negativo, se necessario
if( negativo ) s[i++] = '-';
s[i] = '\0'; // termina la stringa
// "rovescia" la stringa
for( j=0; j<i/2; ++j ) {
char tmp = s[j];
s[j] = s[i-j-1];
s[i-j-1] = tmp;
}
}
else {
if( base>1 && base<37 )
strcpy( s, "(base non valida)" );
else strcpy( s, "(dimensioni tipo int eccessive)" );
}
return s;
}