3-5 itob.c

これもありきたりかなぁ…
工夫があんまり思いつかない。

/*
 * P78 演習3-5
 *   符号なし整数nをb進文字表現に変換し、sに格納する(itoa
 *   と同様な)関数itob(n, s, b)を書け。とくにitob(n, s, 16)は
 *   nをs中の16進文字に変換する。
 *
 *         2007/09/12 arikui
 *
 */


#include <string.h>

void reverse(char *s){
    int c, i, j;
    
    for(i = 0, j = strlen(s) - 1; i < j; i++, j--){
        c = s[i];
        s[i] = s[j];
        s[j] = c;
    }
}


void itob(unsigned int n, char *s, int b){
    int i = 0, d;
    
    if (b < 2 || b > ('z' - 'a' + 10 + 1)) b = 10;
    
    
    do{
        if ((d = n % b) < 10) s[i++] = d + '0';
            else s[i++] = d - 10 + 'a';
    }while((n /= b) != 0);
    
    
    s[i] = '\0';
    reverse(s);
}




//Test Driver
#include <stdio.h>
#include <limits.h>

int main(void){
    int n = 255;
    char buf[1024];
    
    itob(n, buf, 16);
    printf("itob(%d, 16) = %s\n", n, buf);
    
    itob(n, buf, 2);
    printf("itob(%d, 2) = %s\n", n, buf);
    
    
    return 0;
}