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

本文介绍一个对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 *= aDes.Ptr();
    
const TUint16 *p2 = aDes.Ptr() + aDes.Length() - 1;
    
while ((p <= p2) && (*== TChar(' '|| *== TChar('/t'))) ++p;
    
return TPtrC(p, p2 - p + 1);
    }


TPtrC StringHelper::TrimRight(
const  TDesC &  aDes)
    
{
    
const TUint16 *= 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);

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

欢迎同行们参与测试、提出问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值