Symbian C ++ - Операции с подстроками над дескрипторами
Вопрос
Каков предпочтительный / самый простой способ манипулирования строками 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 и не думать о Symbian C ++ все время со стандартной точки зрения C или Си ++.Используйте библиотеки, специально предоставленные Symbian, вместо стандартных библиотек C / C ++, которые Symbian может поддерживать напрямую, а может и не поддерживать.Поскольку конечной целью приложения, разработанного на 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 & amp;)) перед использованием. Попытка сделать Symbian похожим на "обычный" C ++ с char * и wchar_t * на самом деле не работает - использование дескрипторов слишком укоренилось в ОС.