- UID
- 70744
注册时间2010-11-1
阅读权限30
最后登录1970-1-1
龙战于野
![Rank: 4](template/lewei_blue/images/star_level3.gif)
该用户从未签到
|
发表于 2010-11-5 10:16:14
|
显示全部楼层
本帖最后由 hnynes 于 2010-11-5 10:18 编辑
这段代码,第一点看那个
int mystrlen(char * str)
{
if(!*str)return 0;
else return mystrlen(++str)+1;
}
这种写法效率太低,对于字符串的长度,这个确实是没有什么好办法,一般来讲无法测试长度的就,直接让调用者给个长度吧,这个并没有什么问题的。很容易的。
这个方法既然参数已经定义为了char *,就没有必要再去逐个字节地计算长度,直接一个strlen就可以了。没有必要弄得那么复杂,要不然,你就将参数改为void * 喽。
另外一点,这个也不见得支持什么非char *的类型,因为在强转为int *后,很有可能会使串中的某个字节为\0,所以这种写法在某种程序上来讲,还有错误。既然是对字符串的,直接使用strlen或者字节检查就行,递归效率太低。
int mystrlen(char * str)
{
int length = 0;
while (!str)
{
++length;
}
return length;
或者直接用
int length = 0;
if (str)
{
length = strlen(str);
}
return length;
}
再看下面的
main()
{
char a[2];
int (*myprint)(char *,... ) = printf;
char * str = "%d\n";
a[0] = 0;
a[1] = 0;
scanf("%d",(char *)a);
(* myprint)(str,*(int *)a);
(* myprint)(str,mystrlen("Hello,Nisy!"));
}
第二点呢,这个里面完全是闹眼子。
int (*myprint)(char *,... ) = printf;
定义一个这种指针纯属多余。
简单的写法就可以完成的事情,弄得那么复杂不知何用意。
main()
{
char a[4] = "";
char * str = "%d\n";
scanf("%d",(int *)a);
printf(str, *(int *) a);
printf(str, mystrlen("Hello,Nisy!"));
}
上面我还改了a串的长度,因为在32位机上,整型数是4字节的,如果只给两个字节,会溢出。再或者你可以使用short。
当然我并不想否定这段代码的原作者的思想,只是简单的东西,就应该用最简单的办法去实现,编程开发更多的思想层面的东西,而不是技巧上的滥用,代码是写给机器看的,但同时也是给你看的。 |
|