您的位置:首页 > 其它

itoa 用法与源码剖析

2016-06-21 16:25 253 查看
一:用法示例



函数原型:char* _itoa(int value, char* string, int radix)

实现功能:按照进制准则,把数字转换字符串

参数:

int value 要转换的数字

char* string 存储字符串

int radix 进制

举例:

/* itoa example */
#include <stdio.h>
#include <stdlib.h>

int main()
{
int i;
char buffer[33];
printf("Enter a number: ");
scanf("%d", &i);
itoa(i, buffer, 10);
printf("decimal: %s\n", buffer);
itoa(i, buffer, 16);
printf("hexadecimal: %s\n", buffer);
itoa(i, buffer, 2);
printf("binary: %s\n", buffer);
return 0;
}


Output:

Enter a number: 1750
decimal: 1750
hexadecimal: 6d6
binary: 11011010110

二:源码

char* _itoa(int value, char* string, int radix)
{
char tmp[33];
char* tp = tmp;
int i;
unsigned v;
int sign;
char* sp;
if (radix > 36 || radix <= 1)
{
__set_errno(EDOM);
return 0;
}
sign = (radix == 10 && value < 0);
if (sign)
v = -value;
else
v = (unsigned)value;

while (v || tp == tmp)
{
i = v % radix;
v = v / radix;
if (i < 10)
*tp++ = i + '0';
else
*tp++ = i + 'a' - 10;
}
if (string == 0)
string = (char*)malloc((tp - tmp) + sign + 1);
sp = string;
if (sign)
*sp++ = '-';
while (tp > tmp)
*sp++ = *--tp;
*sp = 0;
return string;
}


三:源码剖析

char* _itoa(int value, char* string, int radix)
{
char tmp[33];
char* tp = tmp;
int i;
unsigned v;
int sign;
char* sp;
if (radix > 36 || radix <= 1)
{
__set_errno(EDOM);
return 0;
}
/*
编程语言的基础类库一般最大到36,小于2的进制没有意义,如果给定的参数不满足这个范围,
运行时会发出Debug Assertion Failed。对于最小的进制2,一个int,4个字节,32位,tmp
开33的数组足够
*/

sign = (radix == 10 && value < 0);
if (sign)
v = -value;
else
v = (unsigned)value;
/*
这里对radix进行分类,10进制与非10进制,如果是10进制,直根据负数还是正数进行转化就行,
如果不是10进制,根据反码,补码的知识,把value转成unsigned类型
*/

while (v || tp == tmp)
{
i = v % radix;
v = v / radix;
if (i < 10)
*tp++ = i + '0';
else
*tp++ = i + 'a' - 10;
}
/*
转化过程
*/

if (string == 0)
string = (char*)malloc((tp - tmp) + sign + 1);
/*
如果给定的指针不指向有效的内存区,根据所给参数申请足够的内存
*/

sp = string;
if (sign)
*sp++ = '-';
while (tp > tmp)
*sp++ = *--tp;
*sp = 0;
return string;
}


点击进入目录---->
C++源码剖析目录
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: