如何对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);
上述测试代码均成功通过。
欢迎同行们参与测试、提出问题。
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);
上述测试代码均成功通过。
欢迎同行们参与测试、提出问题。
相关文章推荐
- SQL语句:orac 3ff0 le中如何插入Date类型的数据和根据Date数据进行查询的方法
- [Unity&JSON]如何在同一个JSON文档中存入多个不同类型的数据
- 不同类型的数据层如何进行属性字段的连接?
- 如何确定某段时间之内玩手机次数及其他各种通过传感器&GPS数据可进行的分析
- 如何把&quot;用户定义的数据类型&quot;的ower改为dbo?
- 如何使用Hive&R从Hadoop集群中提取数据进行分析
- 三层中如何在服务器与客户端之间传输自定义的'Record'类型数据的例子
- hibernate如何对Blob类型字段进行数据添加
- mybatis查询如何返回List<Map>类型数据
- Oracle&nbsp;如何修改列的数据类型
- 数据库中如何将字类型的数据进行比较
- 参数中有const时进行数据类型的转换问题-固定变量转常量
- [c&cpp]const char* 和const char []在代码中如何识别各自类型
- Java 面试题之反射的应用(如何在List<String> list = new ArrayList<String>();中放入Integer类型的数据)
- AFNetWorking是如何进行数据缓存的--之AFImageCache & NSURLCache 详解
- 在sqlserver中如何对text类型的数据进行replace操作。 MS-SQL Server / 基础类 - CSDN社区 community.csdn.net
- KeyValuePair<byte, string> 类型的数据如何绑定到ComboBox控件上
- [求教] - 关于ASP中如何对数据表字段中所包含的特殊字符 ' 与 " 进行转义处理?
- PriorityQueue如何对对象类型的数据进行排序
- 【量化小讲堂-Python&Pandas系列01】如何快速上手使用Python进行金融数据分析