操作 TDesC 字符串的首选/最简单方法是什么,例如获取子字符串。
我会给你一个我的场景的例子。
RBuf16 buf;
...
CEikLabel label;
...
label->SetTextL(buf); // (SetTextL takes a const TDesC&)
我想从 buf 中获取一个子字符串。那么我是否想直接操作 RBuf16,如果是,最好的方法是什么?
有没有办法转换为 const char* 所以我可以使用标准的 C 字符串操作。
提前致谢
阅读 descriptors.blogspot.com(加载后向下滚动)。
您可以使用 TDes::LeftTPtr、TDes::RightTPtr 或 TDes::MidTPtr,它们将为您提供一个子字符串作为 TPtr(即操作原始数据的描述符)。
如果要创建子字符串的副本,可以使用 TDes::Copy 函数。
最好与否,我无法评论,但我使用以下方法从描述符中提取子字符串:
TDes::LeftTPtr()
TDes::MidTPtr()
TDes::RightTPtr()
或者
TDesC::Left()
TDesC::Mid()
TDesC::Right()
两组的区别在于前者返回一个新的可修改描述符,后者返回一个新的不可修改描述符,包含子字符串。
当您在 Symbian 平台上进行开发时,我强烈建议您遵循 Symbian 约定,不要一直从标准 C 或 C++ 的角度来考虑 Symbian C++。使用 Symbian 专门提供的库,而不是 Symbian 可能直接支持或不支持的标准 C/C++ 库。由于在 Symbian 上开发的应用程序的最终目标是在应用程序的可靠性和稳健性最重要的移动设备上运行,因此您应该坚持 Symbian 的偏好和建议。
如果您想要来自 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&))。试图使 Symbian 看起来像带有 char* 和 wchar_t* 的“普通”C++ 并没有真正起作用——描述符的使用在操作系统中过于根深蒂固。