免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: FH
打印 上一主题 下一主题

[函数] 使用标准库函数的Trim [复制链接]

论坛徽章:
0
11 [报告]
发表于 2006-09-18 13:46 |只看该作者
谢谢,使用了。效果不错。

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
12 [报告]
发表于 2006-09-18 14:17 |只看该作者
这里使用memcpy是不正确的,源和目的地址存在重叠情况,结果依赖于实现,应该使用memmove。

论坛徽章:
0
13 [报告]
发表于 2006-09-18 15:28 |只看该作者
原帖由 hellioncu 于 2006-9-18 14:17 发表
这里使用memcpy是不正确的,源和目的地址存在重叠情况,结果依赖于实现,应该使用memmove。

找bug的能力不錯!

论坛徽章:
0
14 [报告]
发表于 2006-09-18 16:51 |只看该作者
晕!千年老帖

我也帖一个(好象是mysql里的代码)

  1. /*
  2. * Remove any tabs and spaces from the begining and the end of
  3. * a string
  4. */
  5. char* trim(char* _s)
  6. {
  7.         int len;
  8.         char* end;

  9.              /* Null pointer, there is nothing to do */
  10.         if (!_s) return _s;

  11.              /* Remove spaces and tabs from the begining of string */
  12.         while ((*_s == ' ') || (*_s == '\t')) _s++;

  13.         len = strlen(_s);

  14.         end = _s + len - 1;

  15.              /* Remove trailing spaces and tabs */
  16.         while ((*end == ' ') || (*end == '\t')) end--;
  17.         if (end != (_s + len - 1)) {
  18.                 *(end+1) = '\0';
  19.         }

  20.         return _s;
  21. }
复制代码

[ 本帖最后由 westgarden 于 2006-9-18 19:00 编辑 ]

论坛徽章:
0
15 [报告]
发表于 2006-09-21 10:02 |只看该作者
原帖由 westgarden 于 2006-9-18 16:51 发表
晕!千年老帖

我也帖一个(好象是mysql里的代码)
[code]
/*
* Remove any tabs and spaces from the begining and the end of
* a string
*/
char* trim(char* _s)
{
        int len;
        char* end;

...

你贴的代码有bug,当len = 0;时,_s + len - 1 越界

论坛徽章:
38
2017金鸡报晓
日期:2017-02-08 10:39:4215-16赛季CBA联赛之深圳
日期:2023-02-16 14:39:0220周年集字徽章-年
日期:2022-08-31 14:25:28黑曼巴
日期:2022-08-17 18:57:0919周年集字徽章-年
日期:2022-04-25 13:02:5920周年集字徽章-20	
日期:2022-03-29 11:10:4620周年集字徽章-年
日期:2022-03-14 22:35:1820周年集字徽章-周	
日期:2022-03-09 12:51:3220周年集字徽章-年
日期:2022-02-10 13:13:4420周年集字徽章-周	
日期:2022-02-03 12:09:4420周年集字徽章-20	
日期:2022-01-25 20:14:2720周年集字徽章-周	
日期:2022-01-13 15:12:33
16 [报告]
发表于 2006-09-22 00:20 |只看该作者
Trim是CU最流行的算法?

论坛徽章:
0
17 [报告]
发表于 2006-09-22 19:44 |只看该作者
原帖由 isnowran 于 2006-9-21 10:02 发表

你贴的代码有bug,当len = 0;时,_s + len - 1 越界


你不会是学pascal出身的吧?
请你再仔细看一遍我帖的代码。

论坛徽章:
0
18 [报告]
发表于 2006-09-22 22:46 |只看该作者
原帖由 westgarden 于 2006-9-22 19:44 发表


你不会是学pascal出身的吧?
请你再仔细看一遍我帖的代码。

不好意思,俺是学foxbase出身的,请教:
如果这样调用:

  1. trim( "" );
复制代码


执行到这里

  1. ...
  2. len = strlen(_s);
  3. end = _s + len - 1;
  4. ...
复制代码

end 等于多少?

论坛徽章:
0
19 [报告]
发表于 2006-09-23 00:50 |只看该作者
原帖由 isnowran 于 2006-9-22 22:46 发表

不好意思,俺是学foxbase出身的,请教:
如果这样调用:

  1. trim( "" );
复制代码


执行到这里

  1. ...
  2. len = strlen(_s);
  3. end = _s + len - 1;
  4. ...
复制代码

end 等于多少?


又晕!你最好测试一下,好吗?

算了,还是我辛苦一下吧!

char* end;
...
end = _s + len - 1; // 若_s = "",则len = 0end = "",最后返回""


再极端的例子:
trim(null); // 或trim(0); 也没错。返回null0






[ 本帖最后由 westgarden 于 2006-9-23 01:09 编辑 ]

论坛徽章:
0
20 [报告]
发表于 2006-09-23 01:42 |只看该作者
俺胡老师说了,_s以前的空间不是你的地盘,你不能做主去测试,更不能做主去写0
俺胡老师又说了,没有发生错误并不代表没有错误,只是偶尔走狗屎运而已
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP