练习 3-5 编写函数 itob(n, s, b),将整数 n 转换为以 b 为底的数,并将转换结果以字符的形式保存到字符串 s 中。例如,itob(n, s, 16)把整数 n 格式化成十六进制整数保存在 s 中。
一开始想的是设置一个进制转换表,比如16进制得到[0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f],进制得到[0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o]等等,每得到一个模数之后便直接从里面根据下标取值放入新的字符串。编完之后看了其他人的程序觉得没必要这么复杂。可以借鉴以下博主的程序:
但是可以在他的程序之上增加一段进制检查的代码,防止输入进制数过大或过小。
#include <stdio.h>
#include <string.h>
#define MAXLEN 32
void itob(int n, char s[], int b);
void reverse(char s[]);
int main()
{
int n, b;
char s[MAXLEN]; //2进制长度最大
printf("Please input digit n, and system b:\n");
scanf("%d, %d", &n, &b);
itob(n, s, b);
return 0;
}
void itob(int n, char s[], int b)
{
int i, sign, k;
char t[b+1];
if (b < 37 && b > 0) //英文字母有26个,所以设置了最大36进制
;
else
{
printf("illegal\n");
return;
} //进制检查
sign = n;
for (i = 0; i <= b; i++)
{
if (i <= 10)
s[i] = '0' + i - 1;
else s[i] = 'a' + i - 11;
} //创建进制转换表
s[i++] = '\0';
i = 0;
do {
if (sign < 0)
{
k = -(n % b);
t[i++] = s[++k];
}
else
{
k = n % b;
t[i++] = s[++k];
}
} while ((n /= b) > 0);
if (sign < 0)
t[i++] = '-';
t[i] = '\0';
reverse(t); //生成的字符表为逆序排列,需要逆转
printf("inverted to %d system:%s\n", b, t);
return;
}
void reverse(char s[])
{
int i, j, c;
for (i = 0, j = strlen(s) - 1; i < j; i++, j--)
{
c = s[i];
s[i] = s[j];
s[j] = c;
}
return;
}