Symbian C ++ - 描述符的子串操作

时间:2008-12-02 15:19:40

标签: c++ symbian substring s60

操作TDesC字符串的首选/最简单方法是什么,例如获取子字符串。

我将举例说明我的情景。

RBuf16 buf;
...
CEikLabel label;
...
label->SetTextL(buf); // (SetTextL takes a const TDesC&)

我想从buf获取子字符串。所以我想直接操纵RBuf16,如果是这样,最好的方法是什么?

有没有办法转换为const char *所以我可以使用标准的C字符串操作。

提前致谢

3 个答案:

答案 0 :(得分:2)

阅读descriptors.blogspot.com(加载后向下滚动)。

您可以使用TDes :: LeftTPtr,TDes :: RightTPtr或TDes :: MidTPtr,它将为您提供一个子串作为TPtr(即操纵原始数据的描述符)。

如果要创建子字符串的副本,可以使用TDes :: Copy函数。

答案 1 :(得分:2)

最好与否,我无法发表评论,但我使用以下方法从描述符中提取子字符串:

TDes::LeftTPtr()
TDes::MidTPtr()
TDes::RightTPtr()

TDesC::Left()
TDesC::Mid()
TDesC::Right()

两个集合之间的区别在于前者返回一个新的可修改描述符,后者是一个新的不可修改的描述符,包含子字符串。

当您在Symbian平台上开发时,我建议您高度遵循Symbian惯例,而不是始终从标准的C或C ++角度考虑Symbian C ++。使用Symbian专门提供的库,而不是Symbian可能或可能不直接支持的标准C / C ++库。由于在Symbian上开发的应用程序的最终目标是在移动设备上运行,其中应用程序的可靠性和健壮性最重要,因此您应该坚持使用Symbian更喜欢和建议的内容。

答案 2 :(得分:1)

如果你想要一个RBuf16的子串,这很简单 - 只需使用TDes16::MidTPtr

您可以通过以下方式转换const char *:

TPtr8 narrowBuf;

// Create a buffer with enough space to store every character, plus one for 
// a null terminator
narrowBuf.AllocL( buf.Length() + 1);

// TPtr8::Copy accepts a TDesC16 
narrowBuf.Copy( buf );

// Append a null terminator and return a pointer to the resultant data
const char* ptr = (const char*)narrowBuf.PtrZ();

但是,您现在拥有的是原始数据的缩小副本。如果你想现在再次设置标签,你需要在使用之前加宽它(TDes16 :: Copy(const TDesC8&))。尝试使用char *和wchar_t *使Symbian看起来像“普通”C ++并不真正起作用 - 在操作系统中使用描述符过于根深蒂固。