【C语言】练习3-5

  •  题目来源:《The C programming language》中的习题P51
  •  练习2-1:  编写函数itob(n, s, b),将整数n转换为以b为底的数,并将转换结果以字符的形式保存到字符串s中。例如,itob(n, s, 16)把整数n格式化成16进制整数保存在s中。

  解题思路:这题本身并不难,由于习惯性思维,我们可能会忽略一些关键性的东西。比如,对于题目中的进制数,我们一般只会考虑到有2进制、8进制和16进制,其实 还有3进制,4进制...,总的来说进制数的范围为[2,36]。还有一点,对于整数,我们可能常常考虑的是正整数。下面我们看一下具体的代码实现。

  代码实现

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
/* 字符串逆转 */
void reverse_itob(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(int n, char s[], int b) {
    static char digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    int i, sign;
    // 判断是否位于进制数的范围
    if ( b < 2 || b > 36 ) {
        fprintf(stderr, "EX3_5: 不持支持进制数 %d
", 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] = '';
    reverse_itob(s);
}

int main(void) {
    char buffer[10];
    int i;
    
    for ( i = 2; i <= 37; ++i ) {
        itob(255, buffer, i);
        printf("255 转化为%-2d 进制的结果为 : %s
", i, buffer);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/ningvsban/p/3803463.html