您的位置:首页 > 其它

如何对const TDesC&数据类型进行Trim

2008-03-07 22:42 344 查看
本文介绍一个对const TDesC&数据类型进行Trim的辅助类: StringHelper 。大家可能都知道,对于可修改的描述符数据可以直接进行Trim,比如:


TDes& des = ...;


des.TrimLeft();


des.TrimRight();


des.Trim();


那么,如何对const TDesC&型数据直接进行Trim呢?下面先从一位网友的提问说起。

近日,有网友提问关于const TDesC& 类型该如何实现Trim。他定义的辅助类StringHelper接口如下:


class StringHelper




...{


public:


static TPtr TrimLeft(const TDesC& aDes);


static TPtr TrimRight(const TDesC& aDes);


static TPtr Trim(const TDesC& aDes);


};

乍一看,参数类型为不可修改类型,却返回可以修改的TPtr类型。答案是无法实现。后来,该贴楼主给出自己的解答,证明能够实现。原帖链接:
http://topic.csdn.net/u/20080305/09/f62678ad-4ecd-411b-bcce-28bc3e2097cd.html

事实上,他的这个实现是有问题的。看一下他的实现代码(未贴出,见上面链接)不难发现,返回值指向一个临时对象,这是没有意义的,是错误的。这也是初学者的常见问题。

下面我将给出const TDesC&进行Trim的实现方法。首先,重新定义StringHelper的接口(StringHelper.h)为:


class StringHelper




...{


public:


static TPtrC TrimLeft(const TDesC& aDes);


static TPtrC TrimRight(const TDesC& aDes);


static TPtrC Trim(const TDesC& aDes);


};



不难发现,将返回值类型由TPtr改为TPtrC,这样更加严谨,遵循Symbian描述符语义。

实现代码如下(StringHelper.cpp):


TPtrC StringHelper::TrimLeft(const TDesC& aDes)




...{


const TUint16 *p = aDes.Ptr();


const TUint16 *p2 = aDes.Ptr() + aDes.Length() - 1;


while ((p <= p2) && (*p == TChar(' ') || *p == TChar('/t'))) ++p;


return TPtrC(p, p2 - p + 1);


}




TPtrC StringHelper::TrimRight(const TDesC& aDes)




...{


const TUint16 *p = aDes.Ptr();


const TUint16 *p2 = aDes.Ptr() + aDes.Length() - 1;


while ((p <= p2) && (*p2 == TChar(' ') || *p2 == TChar('/t'))) --p2;


return TPtrC(p, p2 - p + 1);


}




TPtrC StringHelper::Trim(const TDesC& aDes)




...{


return TrimRight(TrimLeft(aDes));


}



对StringHelper辅助类的测试代码片断:


TBuf<40> buf;


buf.Copy(_L(" hello, world. "));


TPtrC ptr = StringHelper::Trim(buf);


RDebug::Print(buf);


RDebug::Print(ptr);




buf.Copy(_L(" "));


TPtrC ptr2 = StringHelper::Trim(buf);


RDebug::Print(buf);


RDebug::Print(ptr2);




buf.Copy(_L(""));


TPtrC ptr3 = StringHelper::Trim(buf);


RDebug::Print(buf);


RDebug::Print(ptr3);



上述测试代码均成功通过。

欢迎同行们参与测试、提出问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐