| 
注册时间2010-11-1
阅读权限30
最后登录1970-1-1UID70744 龙战于野 
 
 该用户从未签到 | 
 
 发表于 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。
 
 当然我并不想否定这段代码的原作者的思想,只是简单的东西,就应该用最简单的办法去实现,编程开发更多的思想层面的东西,而不是技巧上的滥用,代码是写给机器看的,但同时也是给你看的。
 | 
 |