S60 Open C
Open C Tips and Tricks

Open C Tips and Tricks

Table of Contents

String conversions
Symbian descriptors and C strings compared
How to convert TBuf16 to a char buffer
How to convert TBuf8 to wchar_t
How to convert TText16 to char
How to convert a char array and a wide char array
How to declare a wide-char string

 


String conversions

In case the developer is developing applications where Open C-based functionality is called from a Symbian/S60 application, the need for conversions between Symbian descriptors and different string types provided by Open C is needed.

 


Symbian descriptors and C strings compared

The main difference between Symbian descriptors and C strings is that the Symbian descriptors know how many characters are in a data array. A C string does not know its length, so when length is needed the NULL character that indicates the end of the string has to be scanned.

Another difference arises with buffers. When C code reserves a buffer from the heap or stack, it has to keep the maximum length somewhere. Many C methods that alter the buffer contents do not respect the maximum size of the buffer and can override the reserved memory, causing unknown behavior. Some methods take the maximum length as a parameter but it is difficult to use those types in functions, since a pointer to an array and maximum length have to be passed separately. Buffer descriptors can tell the maximum length, and all the methods they provide respect the buffer limits.

When using neutral descriptor types there is no need to worry about character widths. In a C program, the programmer has to explicitly specify which method to use, for example strcat or wcscat.

The table below contains a comparison of standard C string functions and Symbian counter parts.:

C function Symbian Description
sprintf, swprintf TDes::Format Write formatted data to a string.
strcat, wcscat, strncat, wcsncat TDes::Append Append a string to another.
strcmp, strncmp, wcsncmp TDesC::Compare Compare strings lexicographically.
strcpy, wcscpy strncpy, wcsncpy TDes::Copy Copy a string to another.
strchr, wcschr TDesC::Locate Find a character in a string.
strrchr, wcsrchr TDesC:: LocateReverse Scan the index of the first character from a string that does not exist in the alphabet array.
strspn, wcsspn None Scan index of the first character from string that doesn't exist in alphabet array.
strcspn, wcscspn None Scan the index of the first occurrence of a character in a string that belongs to the set of characters.
strstr, wcsstr TDesC::Find Find a substring.
strtok, wcstok TLex:: Find the next token in a string.
strlen, wcslen TDesC::Length Get the length of a string.
strcoll, wcscoll TDesC::CompareC Compare strings using locale-specific information.
strftime, wcsftime Using TDes::Format and TTime Format a time string.

 


How to convert TBuf16 to a char buffer

A TBuf16 buffer can be converted to a char buffer using the wcstombs API. The example below illustrates how the conversion can be done.

#include <e32base.h>
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>

#define SIZE 20
_LIT(KData,"hello");
  
int main (void)
{
    TBuf16<SIZE> buf(KData);
    size_t ret;
    char carray[SIZE];
   
    ret = wcstombs(carray, (const wchar_t *)buf.PtrZ(), SIZE );
    printf("TBuf converted to char buffer : %s\n",carray);
    getchar();
    return (1);
}

 


How to convert TBuf8 to wchar_t

ATBuf8 buffer can be converted to wchar_t using the mbstowcs API.

 #include <e32base.h>
 #include <sys/types.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <wchar.h>
 
 #define SIZE 20
 
 int main (void)
 {
     TBuf8<SIZE> buf(_L8("hello"));
     size_t ret;
     wchar_t warray[SIZE];
  
     ret = mbstowcs(warray, (const char *)buf.PtrZ(), SIZE );
     printf("TBuf8 converted to wchar buffer : %ls\n",warray);
     getchar();
     
     return (1);
 }

 


How to convert TText16 to char

The wcstombs API can be used to convert a TText16 buffer to a char buffer. This is one of the examples of converting from a Symbian data type to a C data type.

#include <e32def.h>
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>

#define SIZE 32

int main (void)
{
   TText arr[SIZE] = L"abcdef";
   char carray[SIZE];
   size_t ret;

   ret = wcstombs(carray, (const wchar_t *)arr, SIZE);
   printf("TText converted to char buffer : %s",carray);
   getchar();

   return (1);
}

 


How to convert a char array and a wide char array

When we want to use both char and wide char pointers or array in our program, we have to convert buffers from a char to a wide char and vice versa. Wide character APIs provide methods to:
  • convert a char array to a wide char array
  • convert a wide char array to a char array

Converting a char array to a wide char array

The mbstowcs API can be used to convert a char array to a wide char array.

#include <stdlib.h>
#include <wchar.h>

#define ARRAY_SIZE 32

int main(void)
{
   char *carray = "char array";
   wchar_t warray[ARRAY_SIZE];
   size_t ret;

   ret = mbstowcs(warray, (const char *)carray, ARRAY_SIZE);
   wprintf(L"character array contents : %s\n",carray);
   wprintf(L"wide char array contents : %ls\n",warray);
   getwchar();

   return (1);
}

Converting a wide char array to a char array

The wcstombs API can be used to convert a wide char array to a char array.

#include <stdlib.h>
#include <wchar.h>

#define ARRAY_SIZE 32

int main(void)
{
   wchar_t *warray = L"wide array";
   char carray[ARRAY_SIZE];
   size_t ret;

   ret = wcstombs(carray, (const wchar_t *)warray, ARRAY_SIZE);
   wprintf(L"wide char array contents : %ls\n",warray);
   wprintf(L"character array contents : %s\n",carray);
   getwchar();

   return (1);
}

 


How to declare a wide-char string

To declare a wide-char string, prefix the string with 'L' [Capital L].

#include <wchar.h>

int main(void)
{
     wchar_t *wptr = L"This is a wide char string";
  
     wprintf(L"%ls\n",wptr);
     getwchar(); 
}

Give feedback of this section


©Nokia 2007

Back to top


This material, including documentation and any related computer programs, is protected by copyright controlled by Nokia. All rights are reserved. Copying, including reproducing, storing, adapting or translating, any or all of this material requires the prior written consent of Nokia. This material also contains confidential information, which may not be disclosed to others without the prior written consent of Nokia.

Nokia is a registered trademark of Nokia Corporation. S60 and logo is a trademark of Nokia Corporation. Java and all Java-based marks are trademarks or registered trademarks of Sun Microsystems, Inc. Other company and product names mentioned herein may be trademarks or tradenames of their respective owners.