|
公告
日历
| | 日 | 一 | 二 | 三 | 四 | 五 | 六 |
|---|
| 28 | 29 | 30 | 1 | 2 | 3 | 4 | | 5 | 6 | 7 | 8 | 9 | 10 | 11 | | 12 | 13 | 14 | 15 | 16 | 17 | 18 | | 19 | 20 | 21 | 22 | 23 | 24 | 25 | | 26 | 27 | 28 | 29 | 30 | 31 | 1 | | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
|
统计
- 随笔 - 71
- 文章 - 0
- 评论 - 201
- 引用 - 0
导航
常用链接
留言簿(17)
我参与的团队
随笔分类
随笔档案
相册
blog
links
宠物
积分与排名
最新评论

阅读排行榜
评论排行榜
|
山海上有人问到的,以前写过一个,不过当时还要一个局部变量的,后来改了一下就只要一行了,贴出来大家欣赏吧:) | 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
评论:
-
#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楼
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楼
Posted @ 2005-06-23 09:44
递归确实是低效一些:)
我这里不惜改变了函数的接口,并且使用各种极端手段比如递归仅仅是为了达到语法上一个语句的目的。这叫做放弃一切- -,呵呵。或者叫顾此失彼...
再强调一下,这个函数的目的仅仅为了拽语法而已。穷显摆,而不是真的要用。或者叫华而不实:)
回复 引用 查看
-
#5楼
Posted @ 2005-09-29 09:07
你这是将整数转换成字符串的函数么?好像是将字符串转换成整数了
回复 引用
-
#6楼
Posted @ 2005-09-29 14:24
是数字转盘成字符串。
回复 引用
-
#7楼
Posted @ 2005-09-29 14:51
void myitoa(char *s, int n)
{
sprintf(s, "%d", n);
}
回复 引用
-
#8楼
Posted @ 2005-09-29 14:54
@htqx,我知道sprintf可以这么用:)不过那样就不叫myitoa了对吧。
回复 引用
-
#9楼 [ 楼主]
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楼 [ 楼主]
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楼
Posted @ 2006-06-03 15:52
@航天奇侠
it includes some holes with security
回复 引用
-
#12楼
Posted @ 2006-06-22 16:30
真的是穷显摆,效率不高,可读性还这么差。。。
回复 引用
-
#13楼
Posted @ 2006-07-28 13:47
老大,你发癔症吗?
你的代码执行的结果根本就不对,你测试了吗?
回复 引用
-
#14楼 [ 楼主]
Posted @ 2006-07-28 14:20
@proguru, 能不能给个数据?
回复 引用 查看
-
#15楼
Posted @ 2006-08-04 15:27
不是吧 ,大哥,先别说效率,你的代码根本就不对!
试试这个,你看他输出什么:
myitoa(s,010);
回复 引用
-
#16楼 [ 楼主]
Posted @ 2006-08-04 15:30
@aurora, 输出8
回复 引用 查看
-
#17楼
Posted @ 2007-04-29 09:59
大家的技巧的确很厉害,佩服,但如果让我检查我就可以作出批评了:每个传进来的参数都没有作正确性判断,在我小组里我是不会很容易让他通过的
回复 引用
-
#18楼 [ 楼主]
Posted @ 2007-05-07 15:34
@ye-------
娱乐不同于工作:)
回复 引用 查看
|