itoa函数是将一个数字转化为其对应的进制数格式
例如 -10 转为10进制 -10
4转为2进制 100
其主要思想是 其中唯一的特殊情况是负数的十进制形式,只要将其特殊处理即可
求进制的方法一般为辗转相除法(注意:这里求得的数据是反的,需要逆置)
#include<stdio.h>
#include<assert.h>
char* my_itoa(int value,char* buff,unsigned int radix) {
assert(buff!=NULL&&radix>1);//断言buff不为空并且所求进制数大于1
char index[] = "0123456789abcdefghijklmnopqrstuvwxyz";
//定义字符组,用来表示各种需要的数
unsigned int temp = (unsigned int)value;//将有符号的value值强转为无符号型的
int flag = value < 0 && radix == 10 ? 1 : 0;//判断是否为十进制(特殊处理)
if (flag == 1) {//判断为十进制且为负数
buff[0] = '-';//首元素为负号
temp *= -1;//将value变为正数
}
int i = flag;
for (; temp != 0;i++) {
buff[i] = index[temp % radix];
temp /= radix;
}
buff[i] = '\0';
//因为使用辗转相除法求得的是逆序,所以需要将整个数组逆置
for (int j = 0; j < (i - flag)/2;j++) {
int temp = buff[j+flag];
buff[j + flag] = buff[i - 1 - j];
buff[i - 1 - j] = temp;
}
return buff;
}
int main() {
char buff[256];
char* res = my_itoa(11,buff,16);
printf("%s\n",res);
return 0;
}
测试用例:(第一个数字是待转数字,第二个数字是进制数)