Symbian 学习日志(五. 字符串)

 

一、TDesC

不能修改的描述符,提供二个方法:Length() 取长度,Ptr() 取字符串;

使用TDesC 指向一个不会被改动的字符串。

 

二、TDes

可以修改的描述符,从TDesc 派生而来;

 

三、TPtrC

相当C语言中的 const char*,指向一个不可以更改内容的字符串指针;

 

TPtrC  的使用

// Literal descriptors are described later in this chapter

_LIT(KLiteralDes, "Sixty zippers were quickly picked from the woven jute bag");

TPtrC pangramPtr(KLiteralDes); // Constructed from a literal descriptor

TPtrC copyPtr(pangramPtr); // Copy constructed from another TPtrC

TBufC<100> constBuffer(KLiteralDes); // Constant buffer descriptor

TPtrC ptr(constBuffer); // Constructed from a TBufC

// TText8 is a single (8-bit) character, equivalent to unsigned char

const TText8* cString = (TText8*)"Waltz, bad nymph, for quick jigsvex";

// Constructed from a zero-terminated C string

TPtrC8 anotherPtr(cString);

TUint8* memoryLocation; // Pointer into memory initialized elsewhere

TInt length; // Length of memory to be represented

TPtrC8 memPtr(memoryLocation,length); // Constructed from a pointer

 

//Example2

// Literal descriptors are described later in this chapter

_LIT(KLiteralDes1, "Sixty zippers were quickly picked from the woven jutebag");

_LIT(KLiteralDes2, "Waltz, bad nymph, for quick jigs vex");

TPtrC alpha(KLiteralDes1);

TPtrC beta(KLiteralDes2);

alpha.Set(KLiteralDes2); // alpha points to the data in KLiteralDes2

beta.Set(KLiteralDes1); // beta points to the data in KLiteralDes1

const TPtrC gamma(beta); // Points to the data in beta, KLiteralDes1

gamma.Set(alpha); // Generates a warning, but points to alpha

 

四、TPtr

_LIT(KLiteralDes1, "Jackdaws love my big sphinx of quartz");

TBufC<60> buf(KLiteralDes1); // TBufC are described later

TPtr ptr(buf.Des()); // Copy construction; can modify the data in buf

TInt length = ptr.Length(); // Length = 12

TInt maxLength = ptr.MaxLength(); // Maximum length = 60, as for buf

TUint8* memoryLocation; // Valid pointer into memory

...

TInt len = 12; // Length of data to be represented

TInt maxLen = 32; // Maximum length to be represented

// Construct a pointer descriptor from a pointer into memory

TPtr8 memPtr(memoryLocation, maxLen); // length = 0, max length = 32

TPtr8 memPtr2(memoryLocation, len, maxLen); // length = 12, max = 32

 

五、TBuf TBufC

放在栈上的BUFFER;用在固定大小或者可变的不超过256个字符的小字符串;

 

TBufC 的使用例

 

_LIT(KPalindrome, "Satan, oscillate my metallic sonatas");

TBufC<50> buf1(KPalindrome); // Constructed from literal descriptor

TBufC<50> buf2(buf1); // Constructed from buf1

// Constructed from a NULL-terminated C string

TBufC<30> buf3((TText*)"Never odd or even");

TBufC<50> buf4; // Constructed empty, length = 0

// Copy and replace

buf4 = buf1; // buf4 contains data copied from buf1, length modified

buf1 = buf3; // buf1 contains data copied from buf3, length modified

buf3 = buf2; // Panic! Max length of buf3 is insufficient for buf2 data

 

 

_LIT8(KPalindrome, "Satan, oscillate my metallic sonatas");

TBufC8<40> buf(KPalindrome); // Constructed from literal descriptor

TPtr8 ptr(buf.Des()); // data is the string in buf, max length = 40

// Illustrates the use of ptr to copy and replace contents of buf

ptr = (TText8*)"Do Geese see God?";

ASSERT(ptr.Length()==buf.Length());

_LIT8(KPalindrome2, "Are we not drawn onward, we few, drawn onward to new era?");

ptr = KPalindrome2; // Panic! KPalindrome2 exceeds max length of ptr(=40)

 

TBuf的使用

 

_LIT(KPalindrome, "Satan, oscillate my metallic sonatas");

TBuf<40> buf1(KPalindrome); // Constructed from literal descriptor

TBuf<40> buf2(buf1); // Constructed from constant buffer descriptor

TBuf8<40> buf3((TText8*)"Do Geese see God?"); // from C string

TBuf<40> buf4; // Constructed empty, length = 0, maximum length = 40

// Illustrate copy and replace

buf4 = buf2; // buf2 copied into buf4, updating length and max length

buf3 = (TText8*)"Murder for a jar of red rum"; // updated from C string

 

六、THBufC BufC<n>

THBufC 是放在堆上的描述符,可以动态分配大小,但不会自动缩放大小,如果要改变大小,则要由程序员进行ReAllocC.

 

_LIT(KPalindrome, "Do Geese see God?");

TBufC<20> stackBuf(KPalindrome);

// Allocates an empty heap descriptor of max length 20

HBufC* heapBuf = HBufC::NewLC(20);

TInt length = heapBuf->Length();// Current length = 0

TPtr ptr(heapBuf->Des()); // Modification of the heap descriptor

ptr = stackBuf; // Copies stackBuf contents into heapBuf

length = heapBuf->Length(); // length = 17

HBufC* heapBuf2 = stackBuf.AllocLC(); // From stack buffer

length = heapBuf2->Length(); // length = 17

_LIT(KPalindrome2, "Palindrome");

*heapBuf2 = KPalindrome2; // Copy and replace data in heapBuf2

length = heapBuf2->Length(); // length = 10

CleanupStack::PopAndDestroy(2, heapBuf);

 

七、定义常量字符串宏

 

_LIT(KMyLiteralDescriptor, "The quick brown fox jumps over the lazy dog");

 

#define _L8(a) (TPtrC8((const TText8 *)(a)))

#define _S8(a) ((const TText8 *)a)

#define _LIT8(name,s) const static TLitC8<sizeof(s)>

name ={sizeof(s)-1,s}

#define _L16(a) (TPtrC16((const TText16 *)L ## a))

#define _S16(a) ((const TText16 *)L ## a)

#define _LIT16(name,s) const static TLitC16<sizeof(L##s)/2>

name ={sizeof(L##s)/2-1,L##s}

 

 

八、类选择

Flow chart to choose the correct descriptor type

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值