| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2639 人关注过本帖, 1 人收藏
标题:关于itoa()函数的实现,想和大家轻松的聊聊,我只是在15楼把自己知道的一个比 ...
只看楼主 加入收藏
madfrogme
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:21
帖 子:1160
专家分:1106
注 册:2009-6-24
结帖率:98.63%
收藏(1)
已结贴  问题点数:20 回复次数:14 
关于itoa()函数的实现,想和大家轻松的聊聊,我只是在15楼把自己知道的一个比较新的实现又发上来了,附加了一点自己的想法,没太大改变
今天突然看到一篇关于itoa()函数实现的文章,很有意思,

好像itoa() 不是ANSI C标准的函数,man 一下itoa,果然找不到

这是一个把整数转为文字列的函数,比如itoa(10, 8)

意思就是按8进制转换10,变成12

据说itoa()早期的实现是出现在google group里

是一个叫Robert Jan Schaper 的洋人写的,如下
程序代码:
char* itoa(int val, int base){
    
    static char buf[32] = {0};
    
    int i = 30;
    
    for(; val && i ; --i, val /= base)
    
        buf[i] = "0123456789abcdef"[val % base];
    
    return &buf[i+1];
    
}


乍看上去不明折什么意思,仔细想想觉得真的很聪明

buf[]里能存32个字符,正好是32位的int

这里的 i 还真让我想了一会儿, 原来下标最多31,返回的时候用的是return &buf[i+1]

所以i 最多可以从30开始......

在我这菜鸟看来,感觉

buf[i] = "0123456789abcdef"[val % base];

 这句写的好漂亮啊(肯定有大鸟在说你看这菜鸟又在大惊小怪了)

一般在用这个函数的时候形式好像都是

char *itoa(int val, char *buffer, int radix)
上面的代码却用了static

但感觉还是多接受一个char * buffer参数比较好吧

大家有没有更多关于itoa()实现了, 拿出来晒晒吧!

[ 本帖最后由 madfrogme 于 2012-1-19 19:53 编辑 ]
搜索更多相关主题的帖子: 函数 google Robert 
2012-01-17 23:18
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:4 
学到新东西感到高兴这很正常。我只想更正一下,itoa函数早在Turbo C的库里就有,声明包含在stdlib.h头文件里。

重剑无锋,大巧不工
2012-01-17 23:25
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:4 
聊聊吧

梅尚程荀
马谭杨奚







                                                       
2012-01-17 23:25
madfrogme
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:21
帖 子:1160
专家分:1106
注 册:2009-6-24
收藏
得分:0 
回复 2楼 beyondyf
嗯,谢谢斑竹指正,也许正因为不是标准,所以个个编译器不一样吧
我的gcc里还真的没有艾
$ gcc -o test test.c
/tmp/ccRgTNsO.o: In function `main':
test.c:(.text+0x2d): undefined reference to `itoa'
collect2: ld returned 1 exit status
wzj@U10:~$

The quieter you become, the more you can hear
2012-01-17 23:35
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
自己实现一下这个函数也不错,你可以扩展到62进制(大小写字母视作不同),加入一些其它符号表示还可以扩展到更高。由此更进一步可以看看什么是Base64编码。

睡前最后一贴,晚安

重剑无锋,大巧不工
2012-01-17 23:39
madfrogme
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:21
帖 子:1160
专家分:1106
注 册:2009-6-24
收藏
得分:0 
回复 5楼 beyondyf
哇塞,这个想法!
晚安!

The quieter you become, the more you can hear
2012-01-17 23:44
madfrogme
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:21
帖 子:1160
专家分:1106
注 册:2009-6-24
收藏
得分:0 
回复 5楼 beyondyf
在斑竹的建议下另一个itoa的另一个实现新鲜出炉了
程序代码:
void itoa(int val, char *buff, int radix) {
    
        int sign;
    
        static char num[]=
"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";

    char *wchar = buff;        /*通过wchar 指针来存储*/

    div_t res;                        /* 这是新学到的本领,div_t构造体里存的是做除法后整数部分和商*/

    if ((sign = val) < 0)        /* 判断正负*/

        val = -val;                

    if(radix > 62 || radix < 2) 

        *wchar = '\0';

        return;

    do {

        res = div(val,radix);   /* 一开始只写了 div(val, radix) ,果然错误 */

        *wchar++ = num[res.rem];

    }while(val = res.quot) ;  /* 一开始只写了 while(res.quot),才发现segmentation fault来自这里*/

    if(sign < 0)

        *wchar++ = '-'; /* 一开始犹豫把 '-'放在最前面,才发现应该放在最后面,因为求出来的字符也是被倒着存的,所以这个版本里要用到strreverse()

    *wchar = '\0';

    strreverse(buff,wchar-1); /* 一开始写的是strreverse(0, wchar -1) ,才发现得不出結果,得是(buff,wchar-1) */
}

void strreverse(char *beg, char *end) {
    char temp;
    while(end > beg)
        temp = *end, *end-- = *beg, *beg++ = temp;
}    


睡前最后一贴,Base64星期天看~~

The quieter you become, the more you can hear
2012-01-18 00:48
madfrogme
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:21
帖 子:1160
专家分:1106
注 册:2009-6-24
收藏
得分:0 
貌似传送伊妹儿的时候只能用文本形式,
所以图像之类的二进制就要被转换,
base64就是其中一种方式啊
原来如此,很有意思的样子,
还想再详细了解

The quieter you become, the more you can hear
2012-01-18 01:06
俺是小c
Rank: 2
来 自:上海师范大学
等 级:论坛游民
帖 子:38
专家分:64
注 册:2012-1-17
收藏
得分:4 
虽然没学过这个,呵呵,感觉挺有趣的··

我叫小C,希望在编程生活里认识很多志同道合的朋友。
2012-01-18 11:25
sd6862959
Rank: 1
等 级:新手上路
帖 子:3
专家分:4
注 册:2012-1-15
收藏
得分:4 
呵呵,最近看完了C PRIMER PLUS,这个工具是在第13章中讲文件输入输出用到的,文本或二进制
2012-01-18 12:18
快速回复:关于itoa()函数的实现,想和大家轻松的聊聊,我只是在15楼把自己知道的 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.026197 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved