itoa()源码
来源:互联网 发布:安卓mac修改器apk 编辑:程序博客网 时间:2024/06/06 01:37
据说是itoa的Solaris源码,
- char *
- itoa(n, base)
- long n; /* abs k16 */
- int base;
- {
- register char *p;
- register int minus;
- static char buf[36];
- p = &buf[36];
- *--p = '/0';
- if (n < 0) {
- minus = 1;
- n = -n;
- }
- else
- minus = 0;
- if (n == 0)
- *--p = '0';
- else
- while (n > 0) {
- *--p = "0123456789abcdef"[n % base];
- n /= base;
- }
- if (minus)
- *--p = '-';
- return p;
- }
static char buf[36]挺tricky的。
Microsoft的实现
- 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;
- }
使用了临时数组,做了出错处理,且传入参数string为NULL时,会动态分配空间。
不解的一点是,为毛sign = (radix == 10 && value < 0); ?正负跟radix等不等于10有毛关系,求高手指点。
今天面试写的代码里没有用临时数组,将倒序的字符写入传入参数string里,最后将string做了一遍倒序,真的不如用个临时数组或静态字符数组方便。
另外,下面有个更狠的,不管你多少进制的,都到Z了;
atoi简单版本
int myatoi(const char *src){
int total = 0;
while (*src)
{
total = total*10 + (int)(*src - '0');
src++;
}
return total;
}
复杂版本:
- isspace(int x)
- {
- if(x==' '||x=='\t'||x=='\n'||x=='\f'||x=='\b'||x=='\r')
- return 1;
- else
- return 0;
- }
- isdigit(int x)
- {
- if(x<='9'&&x>='0')
- return 1;
- else
- return 0;
- }
- int atoi(const char *nptr)
- {
- int c; /* current char */
- int total; /* current total */
- int sign; /* if '-', then negative, otherwise positive */
- /* skip whitespace */
- while ( isspace((int)(unsigned char)*nptr) )
- ++nptr;
- c = (int)(unsigned char)*nptr++;
- sign = c; /* save sign indication */
- if (c == '-' || c == '+')
- c = (int)(unsigned char)*nptr++; /* skip sign */
- total = 0;
- while (isdigit(c)) {
- total = 10 * total + (c - '0'); /* accumulate digit */
- c = (int)(unsigned char)*nptr++; /* get next char */
- }
- if (sign == '-')
- return -total;
- else
- return total; /* return result, negated if necessary */
- }
itoa函数
char *itoa(int num, char *str, int radix)
{
char string[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
char* ptr = str;
int i;
int j;
while (num)
{
*ptr++ = string[num % radix];
num /= radix;
if (num < radix)
{
*ptr++ = string[num];
*ptr = '\0';
break;
}
}
j = ptr - str - 1;
for (i = 0; i < (ptr - str) / 2; i++)
{
int temp = str[i];
str[i] = str[j];
str[j--] = temp;
}
return str;
}
{
char string[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
char* ptr = str;
int i;
int j;
while (num)
{
*ptr++ = string[num % radix];
num /= radix;
if (num < radix)
{
*ptr++ = string[num];
*ptr = '\0';
break;
}
}
j = ptr - str - 1;
for (i = 0; i < (ptr - str) / 2; i++)
{
int temp = str[i];
str[i] = str[j];
str[j--] = temp;
}
return str;
}
原文链接:点击打开链接
0 0
- itoa()源码
- itoa()源码
- itoa的源码实现
- itoa 用法与源码剖析
- itoa
- itoa
- itoa
- itoa
- itoa
- itoa
- itoa
- itoa
- itoa
- itoa
- atoi()和itoa()的标准源码实现
- atoi()和itoa()的标准源码实现
- atoi()和itoa()的标准源码实现
- itoa()和atoi()/atol()的源码
- CentOS6.5 搭建基础PHP环境(yum安装)
- 黑马程序员———java高级特性之泛型
- strace,ltrace linux下跟踪进程调用的命令
- p124第三章45题
- Runtime (二)
- itoa()源码
- 未来 5 年八大热门 IT 职业
- 使用Tcl脚本调用STC平台的Native API实现测试对象、Device、StreamBlock的创建和配置
- 好莱坞八大影业公司
- iOS中消息框提示的出现与自动消失
- Spring声明式事务管理与配置详解
- 为什么我们可以在非UI线程中更新UI
- cout怎么读
- 自定义控件其实很简单3/4