user-0 提问: 【大家来找茬】不知道到这发个这样的帖子合不合适呀。。。各位C/C++大牛们快来呀~~~~~~~~~

回复:
user: user-0
content: 引用 10 楼 vipcxj 的回复:我之所以说LZ分多得没处花是因为既然这代码是LZ自己用来练手的，那么遇到问题就应该自己常识解决，这样水平才能提高，一味依靠别人，那就是在浪费时间   http://bbs.csdn.net/topics/390688307  分已散，请去接分吧

user: user-0
content: 引用 14 楼 vipcxj 的回复:[quote=引用 13 楼 benma378 的回复:] [quote=引用 9 楼 vipcxj 的回复:] 又是一段明显初学者写的代码~  int strcompare(char *s, char *t)   {           if(!s && !t){          return 0;     }     if(s && !t){         return 1;     }     if(!s && t){         return -1;     }     while(*s || *t){ //这个条件是错误滴，*s && *t         if(*s > *t){             return 1;         }else if(*s < *t){             return -1;         }         s++;         t++;     }      //可不能直接返回0     if (*s)        return 1;     else if (*t)        return -1;     else        return 0; }   关于这个条件，我觉得是或关系，因为子串肯定短一些，必须完全遍历一遍父串吧。其实子串可以不要，放在循环里判断更好一些[/quote]  你这种逻辑就是非常有问题的，如果是或关系，就有可能有一个超出字符串范围，一个还在范围内，但出不了循环，仍旧继续在迭代，导致的结果是必然会访问到字符串上无效的位置。其实你只要考虑到循环访问一个字符串，绝对要保证访问的都是有效位置就不会出这种问题了。我估计你的思路是妄图走捷径，希望在循环内一次解决，其实编程最好不要有捷径的想法，情愿事后优化也不要在编写的时候想着直接写出最好最简洁的方法，往往这样花的时间更长，错误率更高。[/quote]  你应该是一个比较有经验的程序员了。。。确实是这样的哈，刚刚想删回复也删不了，想编辑也编辑不了了。确实没有思考清楚就回复了。 嗯，昨晚写的程序，发现时间越晚可能错误率也高。现在我来看着代码，感觉确实思路不清晰，这是一个修炼的过程。我还有很长的路要走！谢谢！我会把可用分散在灌水区里，希望你来拿。。呵呵，兑现我的承诺。好像不能直接转的吧

user: user-1
content: 引用 13 楼 benma378 的回复:[quote=引用 9 楼 vipcxj 的回复:] 又是一段明显初学者写的代码~  int strcompare(char *s, char *t)   {           if(!s && !t){          return 0;     }     if(s && !t){         return 1;     }     if(!s && t){         return -1;     }     while(*s || *t){ //这个条件是错误滴，*s && *t         if(*s > *t){             return 1;         }else if(*s < *t){             return -1;         }         s++;         t++;     }      //可不能直接返回0     if (*s)        return 1;     else if (*t)        return -1;     else        return 0; }   关于这个条件，我觉得是或关系，因为子串肯定短一些，必须完全遍历一遍父串吧。其实子串可以不要，放在循环里判断更好一些[/quote]  你这种逻辑就是非常有问题的，如果是或关系，就有可能有一个超出字符串范围，一个还在范围内，但出不了循环，仍旧继续在迭代，导致的结果是必然会访问到字符串上无效的位置。其实你只要考虑到循环访问一个字符串，绝对要保证访问的都是有效位置就不会出这种问题了。我估计你的思路是妄图走捷径，希望在循环内一次解决，其实编程最好不要有捷径的想法，情愿事后优化也不要在编写的时候想着直接写出最好最简洁的方法，往往这样花的时间更长，错误率更高。

user: user-0
content: 引用 9 楼 vipcxj 的回复:又是一段明显初学者写的代码~  int strcompare(char *s, char *t)   {           if(!s && !t){          return 0;     }     if(s && !t){         return 1;     }     if(!s && t){         return -1;     }     while(*s || *t){ //这个条件是错误滴，*s && *t         if(*s > *t){             return 1;         }else if(*s < *t){             return -1;         }         s++;         t++;     }      //可不能直接返回0     if (*s)        return 1;     else if (*t)        return -1;     else        return 0; }   关于这个条件，我觉得是或关系，因为子串肯定短一些，必须完全遍历一遍父串吧。其实子串可以不要，放在循环里判断更好一些

user: user-0
content: 引用 2 楼 vipcxj 的回复: void strcopy(char **target, char *source)  {     if(!source){         return;     }     unsigned length = strlenth(source);     *target = (char*)malloc(length + 1); //这里要改     if(*target){         return;     }     unsigned int i = 0;       for(; i<length; ++i){         (*target)[i] = source[i];     }     (*target)[i] = '\0'; }   先修正一个在看下面的  length+1确实是的，但是你说在哪种情况下回导致死循环呢还是越界访问？为啥一定要把while改成for呢？while不是更加简洁吗？

user: user-0
content: 引用 10 楼 vipcxj 的回复:我之所以说LZ分多得没处花是因为既然这代码是LZ自己用来练手的，那么遇到问题就应该自己常识解决，这样水平才能提高，一味依靠别人，那就是在浪费时间这话在理，遇到问题应该先自己思考，google之，再思考之。。。  说实话，Java和C、C++差别还是蛮大的。很多繁琐的细节问题Java都不需要去反复考虑，而C、C++就不一样，存在这复杂的指针、内存问题。  当然，从算法的严谨度来说，这样的代码确实太嫩了。但这岂是一朝一夕的事情？  这是一道OJ上的题，由于两年多没接触过C、C++，只有靠大一那点底子了。（当然，你会说这是我不主动学习的借口）当时我提交的时候，自己的用例都通过了，就是不知道为啥OJ上跑就超时了，知道肯定是自己代码问题，但一时找不到自己漏洞到底在哪？对C、C++细节确实不是熟悉，一个从没系统学习过的能熟悉到哪去呢？  当然，如果是要我学习的话，我不会这样学的，应该是从最基础的开始，一步一步来。总之，你猜对了

user: user-1
content: 我之所以说LZ分多得没处花是因为既然这代码是LZ自己用来练手的，那么遇到问题就应该自己常识解决，这样水平才能提高，一味依靠别人，那就是在浪费时间

user: user-1
content: 又是一段明显初学者写的代码~  int strcompare(char *s, char *t)   {           if(!s && !t){          return 0;     }     if(s && !t){         return 1;     }     if(!s && t){         return -1;     }     while(*s || *t){ //这个条件是错误滴，*s && *t         if(*s > *t){             return 1;         }else if(*s < *t){             return -1;         }         s++;         t++;     }      //可不能直接返回0     if (*s)        return 1;     else if (*t)        return -1;     else        return 0; }

user: user-0
content: 引用 6 楼 vipcxj 的回复:老实说看着这些代码的水平，我估计这根本就是LZ自己写来练手的吧，但又不好意思不耻下问，就出此下策了，不过看在LZ的分多得没处花的份上，我还是来帮帮LZ吧 好吧，我确实没啥水平，因为代码总量不超过10w行。。学生党嘛。。。  请友情提示一下代码问题在哪？比如代码风格啊，思路啊，清晰度，可靠性等等这些问题。  当然C/C++用法方面的就算了，我这两年来一直写Java，最近才接触这些东西。主要是算法评价和思路

user: user-1
content: 引用 5 楼 benma378 的回复:[quote=引用 2 楼 vipcxj 的回复:]  void strcopy(char **target, char *source)  {     if(!source){         return;     }     unsigned length = strlenth(source);     *target = (char*)malloc(length + 1); //这里要改     if(*target){         return;     }     unsigned int i = 0;       for(; i<length; ++i){         (*target)[i] = source[i];     }     (*target)[i] = '\0'; }   先修正一个在看下面的 引用 4 楼 benma378 的回复:额，忘了说了，每找出一个，必须说出理由和可行的测试用例。。每一个奖励可用分100分请说出理由[/quote] 你比对一下不就能看出问题了，第一个问题，你为字符串申请内存要length+1，这是常识吧，第二个问题，你后面空指针的判断，其实这应该第一步判断吧，你后判断也是依赖于你strlength里面判断过，不然就死定了。后面的循环，你既然已经搞到了length，为啥还要用while，直接for不就得了。

user: user-1
content: 老实说看着这些代码的水平，我估计这根本就是LZ自己写来练手的吧，但又不好意思不耻下问，就出此下策了，不过看在LZ的分多得没处花的份上，我还是来帮帮LZ吧

user: user-0
content: 引用 2 楼 vipcxj 的回复: void strcopy(char **target, char *source)  {     if(!source){         return;     }     unsigned length = strlenth(source);     *target = (char*)malloc(length + 1); //这里要改     if(*target){         return;     }     unsigned int i = 0;       for(; i<length; ++i){         (*target)[i] = source[i];     }     (*target)[i] = '\0'; }   先修正一个在看下面的 引用 4 楼 benma378 的回复:额，忘了说了，每找出一个，必须说出理由和可行的测试用例。。每一个奖励可用分100分请说出理由

user: user-0
content: 额，忘了说了，每找出一个，必须说出理由和可行的测试用例。。每一个奖励可用分100分

user: user-0
content: 引用 1 楼 user-2 的回复:人艰不拆

user: user-1
content: void strcopy(char **target, char *source)  {     if(!source){         return;     }     unsigned length = strlenth(source);     *target = (char*)malloc(length + 1); //这里要改     if(*target){         return;     }     unsigned int i = 0;       for(; i<length; ++i){         (*target)[i] = source[i];     }     (*target)[i] = '\0'; }   先修正一个在看下面的

user: user-2
content: 人艰不拆