The C Programming Language

Chapter 3 - Control Flow 5

mmresult 2009. 3. 25. 18:05


Answer to Exercise 3-5, page 64
Solution by Paul Griffiths
Write the function itob(n,s,b) that converts the integer n into a base b character representation in the string s . In particular, itob(n,s,16) formats n as a hexadecimal integer in s .

 


/*

  EX3_5.C
  =======
 
  Suggested solution to Exercise 3-5
 
*/
   
#include <stdlib.h>
#include <stdio.h>
   
    void itob(int n, char s[], int b);
void reverse(char s[]);

int main(void) {
    char buffer[10];
    int i;
   
    for ( i = 2; i <= 20; ++i ) {
        itob(255, buffer, i);
        printf("Decimal 255 in base %-2d : %s\n", i, buffer);
    }
    return 0;
}


/*  Stores a string representation of integer n
    in s[], using a numerical base of b. Will handle
    up to base-36 before we run out of digits to use.  */

void itob(int n, char s[], int b) {
    static char digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    int i, sign;
   
    if ( b < 2 || b > 36 ) {
        fprintf(stderr, "EX3_5: Cannot support base %d\n", b);
        exit(EXIT_FAILURE);
    }
   
    if ((sign = n) < 0)
        n = -n;
    i = 0;
    do {
        s[i++] = digits[n % b];
    } while ((n /= b) > 0);
    if (sign < 0)
        s[i++] = '-';
    s[i] = '\0';
    reverse(s);
}


/*  Reverses string s[] in place  */

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;
    }
}

 

'The C Programming Language' 카테고리의 다른 글

Chapter 4 - Functions and Program Structure 1  (0) 2009.03.25
Chapter 3 - Control Flow 6  (0) 2009.03.25
Chapter 3 - Control Flow 4  (0) 2009.03.25
Chapter 3 - Control Flow 3  (0) 2009.03.25
Chapter 3 - Control Flow 2  (0) 2009.03.25