数字转换成字符串,int 转换成const char*

Question:将一个int类型转换成字符串。函数原型:
const char* itoa(int val)


负数前面要添个负号,正数不用。


写了15min……


const char* itoa(int val)
{
    char* s=(char*)malloc(35);
    if(!s) return NULL;
    int sign=val&0x80000000;
    if(sign) val=-val;
    int len=0;
    do{
        s[len++]=val%10+'0';val/=10;
    }while(val);
    if(sign) s[len++]='-';
    char* result=(char*)malloc(35);
    if(!result) return NULL;
    int i;
    for(i=0;i

Q:你的int是多少位的?

A:(难道int不是都是32位的吗?)我的64位机上的int是32位的。

Q:你真的是按照32位来计算的吗?

(他把代码拿回来给我)

A:额。不是。差了4个0。(以前汇编写多了,都是16位寄存器,后遗症啊!)(注:当时我把0x80000000写成0x8000了)


Q:里面涉及到了负数转正数。请问int负数和整数的范围是一样的吗?

A:(啊!-2147483648取负还是它自己!边界值没考虑到!)……不一样。


在涉及到负数的求余操作时会有一些麻烦。所以应该使用它的绝对值。而求-2147483648的绝对值时,应该转换成unsigned int再求。为什么要用do while呢?用while的话,val初始值为0时,result就没输出了。

而且,不应该假设int是32位的。虽然现实如此。因为以前的int是16位的,而且未来的int可能不是32位的。


Q:你用了动态内存。请问这段内存应该由谁来释放呢?

A:(当然是)调用者。

Q:有没有不需要用户去管理的方法呢?

A:(内存泄漏!第一次深深地体验到了C/C++的不便啊。当我第一眼看到返回值时带const的时候,我就觉得怪怪的了)除非传一个字符串进来。

Q:假如不允许呢?

A:(函数内部申请的数组又不能返回,难道static?怎么可能!你坑我啊!)……


后来上网找到一个外国人的代码。它用了static char 数组。第一次发现还有这种用法的。涨知识了。还有十分简洁明了的result[i]="0123456789"[tempval%10];,非常容易改造成其他进制的。


const char* itoa1(int val)
{
    static char result[sizeof(int)<<3+2];
    unsigned int tempval=val;
    if(val<0) tempval=-val;
    int i=sizeof(int)<<3+1;
    do{
        result[i]="0123456789"[tempval%10];
        tempval/=10;--i;
    }while(tempval);
    if(val<0) result[i--]='-';
    return &result[i+1];
}

这个才是比较好的。。。


还有更加简洁的。不得不感叹sprintf的强大。

const char* itoa2(int val)
{
    static char result[sizeof(int)<<3+2];
    sprintf(result,"%d",val);
    return result;
}

然而,自己写的效率是sprintf的2倍多。

完整代码如下:

#include
#include
#include
const char* itoa(int val)
{
    char* s=(char*)malloc(35);
    if(!s) return NULL;
    int sign=val&0x80000000;
    if(sign) val=-val;
    int len=0;
    do{
        s[len++]=val%10+'0';val/=10;
    }while(val);
    if(sign) s[len++]='-';
    char* result=(char*)malloc(35);
    if(!result) return NULL;
    int i;
    for(i=0;i

输出:

0
-945638543
-./,),(-*,(
2147483647
2333

0
-945638543
-2147483648
2147483647
23333

0
-945638543
-2147483648
2147483647
223333



你可能感兴趣的:(数字转换成字符串,int 转换成const char*)