本文介绍一个对const TDesC&数据类型进行Trim的辅助类: StringHelper 。大家可能都知道,对于可修改的描述符数据可以直接进行Trim,比如:
那么,如何对const TDesC&型数据直接进行Trim呢?下面先从一位网友的提问说起。
近日,有网友提问关于const TDesC& 类型该如何实现Trim。他定义的辅助类StringHelper接口如下:
乍一看,参数类型为不可修改类型,却返回可以修改的TPtr类型。答案是无法实现。后来,该贴楼主给出自己的解答,证明能够实现。原帖链接:
http://topic.csdn.net/u/20080305/09/f62678ad-4ecd-411b-bcce-28bc3e2097cd.html
事实上,他的这个实现是有问题的。看一下他的实现代码(未贴出,见上面链接)不难发现,返回值指向一个临时对象,这是没有意义的,是错误的。这也是初学者的常见问题。
下面我将给出const TDesC&进行Trim的实现方法。首先,重新定义StringHelper的接口(StringHelper.h)为:
不难发现,将返回值类型由TPtr改为TPtrC,这样更加严谨,遵循Symbian描述符语义。
实现代码如下(StringHelper.cpp):
对StringHelper辅助类的测试代码片断:
上述测试代码均成功通过。
欢迎同行们参与测试、提出问题。
TDes
&
des
=
...;
des.TrimLeft();
des.TrimRight();
des.Trim();
des.TrimLeft();
des.TrimRight();
des.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);
} ;
{
public:
static TPtr TrimLeft(const TDesC& aDes);
static TPtr TrimRight(const TDesC& aDes);
static TPtr Trim(const TDesC& aDes);
} ;
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);
} ;
{
public:
static TPtrC TrimLeft(const TDesC& aDes);
static TPtrC TrimRight(const TDesC& aDes);
static TPtrC Trim(const TDesC& aDes);
} ;
实现代码如下(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));
}
{
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);
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);
上述测试代码均成功通过。
欢迎同行们参与测试、提出问题。