操作TDesC字符串的首选/最简单方法是什么,例如获取子字符串。
我将举例说明我的情景。
RBuf16 buf;
...
CEikLabel label;
...
label->SetTextL(buf); // (SetTextL takes a const TDesC&)
我想从buf获取子字符串。所以我想直接操纵RBuf16,如果是这样,最好的方法是什么?
有没有办法转换为const char *所以我可以使用标准的C字符串操作。
提前致谢
答案 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 ++并不真正起作用 - 在操作系统中使用描述符过于根深蒂固。