嚎叫一声  
让我尝试写一些opengl的东西吧
公告
日历
<2004年12月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678
统计
  • 随笔 - 71
  • 文章 - 0
  • 评论 - 201
  • 引用 - 0

导航

与我联系

搜索

 

常用链接

留言簿(17)

我参与的团队

随笔分类

随笔档案

相册

blog

links

宠物

积分与排名

  • 积分 - 53102
  • 排名 - 843

最新评论

阅读排行榜

评论排行榜

 
山海上有人问到的,以前写过一个,不过当时还要一个局部变量的,后来改了一下就只要一行了,贴出来大家欣赏吧:)
Code:

int myitoa(char *s,int n)
{
   return *(short *)(s+(n=(n>9)?myitoa(s,n/10):0))=n%10+'0',n+1;
}

int main()
{
   char s[10];
   myitoa(s,14235);
   printf("%s\n",s);
   return 0;
}

( 网页浏览 )
文章来源:http://acm.tongji.edu.cn/people/kaikai/blog/blog.php?job=art&articleid=a_20041119_175739
posted on 2004-12-15 17:49 kaikai 阅读(9082) 评论(18)  编辑 收藏 所属分类: updated from kaikai's weblogc/c++语言
评论:
  • #1楼   乾坤一笑 [未注册用户] Posted @ 2005-06-21 23:17
    static int skip_atoi(const char **s)
    {
    int i=0;

    while (is_digit(**s))
    i = i*10 + *((*s)++) - '0';
    return i;
    }   回复  引用    

  • #2楼   kaikai [未注册用户] Posted @ 2005-06-22 09:13
    我承认它确实是低效的:)
    不过我这个函数的目的不是为了拿来应用,仅仅是冲着一个语句来实现这个去的...目的不同结果也就不尽相同了

    btw.为什么要用const char **s?
      回复  引用    

  • #3楼   乾坤一笑 [未注册用户] Posted @ 2005-06-22 23:05
    问的好!:D

    答案是:这个函数是我从早起Linux内核代码里面copy出来的,当时它为了实现一个叫做int vsprintf(char *buf, const char *fmt, va_list args)函数。就是说在vsprintf()中要调用这个skip_atoi()。它是这样写的:field_width = skip_atoi(&fmt);
    我个人认为,它的作用是避免对fmt做值传递。

    你写的那个函数看似简练,只有一行。但是用了递归,这么一展。。。:p 注:由于日常工作的原因,我一看到递归函数,总是幻想它展开后的样子。-_-b   回复  引用    

  • #4楼   kaikai       Posted @ 2005-06-23 09:44
    递归确实是低效一些:)
    我这里不惜改变了函数的接口,并且使用各种极端手段比如递归仅仅是为了达到语法上一个语句的目的。这叫做放弃一切- -,呵呵。或者叫顾此失彼...
    再强调一下,这个函数的目的仅仅为了拽语法而已。穷显摆,而不是真的要用。或者叫华而不实:)   回复  引用  查看    

  • #5楼   小明 [未注册用户] Posted @ 2005-09-29 09:07
    你这是将整数转换成字符串的函数么?好像是将字符串转换成整数了   回复  引用    

  • #6楼   kaikai [未注册用户] Posted @ 2005-09-29 14:24
    是数字转盘成字符串。   回复  引用    

  • #7楼   航天奇侠 [未注册用户] Posted @ 2005-09-29 14:51

    void myitoa(char *s, int n)
    {
    sprintf(s, "%d", n);

    }
      回复  引用    

  • #8楼   kaikai [未注册用户] Posted @ 2005-09-29 14:54
    @htqx,我知道sprintf可以这么用:)不过那样就不叫myitoa了对吧。   回复  引用    

  • #9楼 [楼主]  kaikai       Posted @ 2006-01-27 10:09
    修改一下,支持负数
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>

    int myitoa(char *s,int n)
    {
    return 1+(n<0?*s='-',myitoa(s+1,-n):(*(short*)&s[n=n>9?myitoa(s,n/10):0]=48+n%10,n));
    }

    int main()
    {
    char s[10];
    char s2[10];
    int a, b;
    a = -1000000;
    b = 1000000;
    int len;
    for (int i = a; i < b; i++)
    {
    len = myitoa(s, i);
    if (len != strlen(s))
    {
    printf("len %d %d %s %s\n", len, i, s, s2);
    }
    itoa(i, s2, 10);
    if (strcmp(s, s2) != 0)
    {
    printf("%d %s %s\n", i, s, s2);
    }
    }
    return 0;
    }
      回复  引用  查看    

  • #10楼 [楼主]  kaikai       Posted @ 2006-01-27 16:10
    pfan的'C语言爱好者'指出这个代码的错误,很有道理。http://www.programfan.com/club/showbbs.asp?id=138763&page=2
    17楼

    我继续修改:
    /**
    myxtoa return pointer to the end-of-string
    */
    char* myxtoa(char *s, const unsigned n)
    {
    return *(short*)(n>9?s=myxtoa(s,n/10):s)=48+n%10,s+1;
    }
    int myitoa(char *s, int n)
    {
    return n<0?*s++='-',myxtoa(s,(unsigned)-n)-s+1:myxtoa(s,(unsigned)n)-s;
    }   回复  引用  查看    

  • #11楼   yeshao [未注册用户] Posted @ 2006-06-03 15:52
    @航天奇侠
    it includes some holes with security   回复  引用    

  • #12楼   guest [未注册用户] Posted @ 2006-06-22 16:30
    真的是穷显摆,效率不高,可读性还这么差。。。   回复  引用    

  • #13楼   proguru [未注册用户] Posted @ 2006-07-28 13:47
    老大,你发癔症吗?
    你的代码执行的结果根本就不对,你测试了吗?   回复  引用    

  • #14楼 [楼主]  kaikai       Posted @ 2006-07-28 14:20
    @proguru, 能不能给个数据?   回复  引用  查看    

  • #15楼   aurora [未注册用户] Posted @ 2006-08-04 15:27
    不是吧 ,大哥,先别说效率,你的代码根本就不对!
    试试这个,你看他输出什么:
    myitoa(s,010);   回复  引用    

  • #16楼 [楼主]  kaikai       Posted @ 2006-08-04 15:30
    @aurora, 输出8   回复  引用  查看    

  • #17楼   ye------- [未注册用户] Posted @ 2007-04-29 09:59
    大家的技巧的确很厉害,佩服,但如果让我检查我就可以作出批评了:每个传进来的参数都没有作正确性判断,在我小组里我是不会很容易让他通过的   回复  引用    

  • #18楼 [楼主]  kaikai       Posted @ 2007-05-07 15:34
    @ye-------
    娱乐不同于工作:)   回复  引用  查看    


标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2005-10-01 15:23 编辑过


相关链接:
 





 
Copyright © kaikai Powered by: 博客园 模板提供:沪江博客