免费注册 查看新帖 |

Chinaunix

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

[函数] Trim函数的我的版本,欢迎批评指正! [复制链接]

论坛徽章:
0
11 [报告]
发表于 2004-03-09 14:36 |只看该作者

Trim函数的我的版本,欢迎批评指正!

是啊!具体到这个问题里,是str1不在str2右,重叠可能发生也可能不发生,对于一般的实现来说,应该没什么问题,我所关心的是str1和str2重合时,库函数会做什么,所以才有了上面那个判断.

论坛徽章:
0
12 [报告]
发表于 2010-10-22 14:19 |只看该作者
强人!

楼主同志,怎么将你定义的宏改为包括所有ASCII码0(\u0000)至32(\u0020),即NULL到SPACE之间所有的值.

论坛徽章:
0
13 [报告]
发表于 2010-10-22 14:48 |只看该作者
Trim函数的我的版本,欢迎批评指正!
  1. while (isSpaces(*pszLast))

  2.                 --pszLast;

复制代码
jamesqiao 发表于 2004-03-08 18:48



    如果这个串全是空格。。。。。

论坛徽章:
0
14 [报告]
发表于 2010-10-26 08:59 |只看该作者
for ( ; (*pszHead != '\0') && (pszHead != pszLast); ++pszHead)
里的(*pszHead != '\0')可以删除吧。

另外,不加#include <string.h>为啥会出现警告?
$ gcc trim.c
trim.c: In function ‘Trim’:
trim.c:13: warning: incompatible implicit declaration of built-in function ‘strlen’
trim.c:27: warning: incompatible implicit declaration of built-in function ‘strcpy’

论坛徽章:
0
15 [报告]
发表于 2010-10-26 13:25 |只看该作者
我一般是这么写:
两个char指针,一个指向字符串首地址,一个指向非空格的首地址。
然后while循环拷贝字符。
循环结束后,自然就知道字符串的尾地址,然后从尾地址反向去掉空格等。

这样就不用在开始的时候调用strlen找尾地址了。

论坛徽章:
0
16 [报告]
发表于 2010-10-26 14:33 |只看该作者
本帖最后由 hdc1112 于 2010-10-26 14:35 编辑

回复 15# damingstudio

楼上说的有道理啊。楼主的代码如果包含strlen的话,其实对字符串遍历了两遍吧。strlen其实内部也在遍历吧。

保持两个指针,扫一遍就够了。一个指针用来遍历。另一个指针跟着跑,如果第一个指针指的是非空格字符,那么第二个指针跟着第一个指针跑;如果第一个指针指向了空格字符,那么第二个指针就歇着不动。遍历后,把第二个指针指的地方改成'\0'完事。

还是等会自己写个代码试试吧。

论坛徽章:
0
17 [报告]
发表于 2010-10-26 15:04 |只看该作者
回复 1# jamesqiao
  1. char *Trim(char *psource)
  2. {
  3.                 char *p1, *p2, *pfn;
  4.                 int fn = 0;

  5.                 pfn = p1 = p2 = psource;
  6.                 for(; *p1 != '\0'; p1++)
  7.                 {
  8.                                 if(!isSpace(*p1))
  9.                                 {
  10.                                                 p2 = p1;
  11.                                                 fn = 1;
  12.                                 }
  13.                                 else
  14.                                 {
  15.                                                 if(0 == fn)
  16.                                                 {
  17.                                                                 pfn++;
  18.                                                 }

  19.                                 }
  20.                 }
  21.                 *(p2 + 1) = '\0';
  22.                 if(psource != pfn)
  23.                 {
  24.                                 strcpy(psource, pfn);
  25.                 }
  26.                 return psource;
  27. }
复制代码

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
18 [报告]
发表于 2010-10-26 15:12 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
19 [报告]
发表于 2010-10-26 15:14 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
20 [报告]
发表于 2010-10-26 15:19 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP