Symbian C ++ - Операции с подстроками над дескрипторами

StackOverflow https://stackoverflow.com/questions/334292

  •  22-07-2019
  •  | 
  •  

Вопрос

Каков предпочтительный / самый простой способ манипулирования строками 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 * на самом деле не работает - использование дескрипторов слишком укоренилось в ОС.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top