#VC++ 字符串 系列文章目录转载
VC++各种字符串类型的说明
前言
总是觉得VC中的类型纷繁复杂,扑朔迷离。因为有了Unicode,因为C、C++类型相互转化如此不同。保存char的不止char一种,还可以用short,unsigned short,int 等来保存。单单就字符串就有N多种类型,其它类型也不止一个。再加上C++中本来就没有正式的string类型,所以,平常就会碰到很多种相同意思,但不同类型,或相同类型,不同写法的Type. 如何在他们之间相互转化,也是在学习VC中避免不了的一个问题。
一、首先看一下几种类型的定义?
typedef char CHAR
typedef wchar_t WCHAR
#ifdef UNICODE
typedef WCHAR TCHAR
#else
typedef char TCHAR
#endif
typedef unsigned char BYTE;
typedef _nullterminated CONST CHAR* LPCSTR;
typedef CHAR *LPSTR;
#ifdef UNICODE
typedef LPWSTR LPTSTR
#else
typedef LPSTR LPTSTR
#endif
#ifdef UNICODE
typedef LPCWSTR LPCTSTR
#else
typedef LPCSTR LPCTSTR
#endif
二.各种类型间的转换
这里,把Cstring看作一个转换的中间值,任何类型都是相它看齐。
1. LPCSTR ←→Cstring
有两种方法,一是强制转换,like below:
Cstring strHello;
strHello="Hello world";
LPCSTR lpStr=(LPCSTR)strHello;
Cstring str2;
str2=(CString)lpStr;
使用Format,
str2.Format("%s",lpStr);
2. LPCTSTR←→Cstring
LPCTSTR和LPCSTR转换方式是一样的,平常,我们一般可以用LPCTSTR来代替LPCSTR。
3. TCHAR*(char*)←→Cstring
TCHAR在VC中表示的是unsigned short,可以支持Unicode字符集。两类型之间的转换可以像以下这样:
TCHAR* myChars = strHello.GetBuffer(strHello.GetLength());
str2=(CString)myChars; //或者str2.Format("%s",myChars);
注意:Cstring转TCHAR不能用以下代码转换:
myChars = (LPCTSTR)strHello; //Error,Can not Convert from 'const char’ to ‘char*’
myChars=(LPTSTR)strHello; //Cstring不能转化为char*
但是可以这样:
myChars=(LPTSTR)(LPCTSTR)strHello; //先把strHello转化为const char*,再转化为char*
-
LPBYTE←→Cstring
LPBYTE是unsigned char*类型,它们之间的转换如下:LPBYTE lpByte = (LPBYTE)strHello.GetBuffer(strHello.GetLength()); //GetBuffer返回LPTSTR类型5. TCHAR[]←→Cstring
它们之间的转换又不一样,因为涉及到数组。所以用strcpy函数来进行,strCpy的函数原型如下:
LPTSTR StrCpy(LPTSTR psz1,LPCTSTR )
它们之间的转换如下:
CHAR strChar[200]
StrCpy(strChar,(LPCTSTR)strHello);
Cstring str2 = (CString)strChar; //或者用Format函数在这里插入代码片
由此可见,Cstring转换到别的类型,都要转成LPCSTR或者LPCTSTR类型这一关(LPCSTR,LPCTSTR代表了const char* , const short*)。然后再通过LPCSTR或LPCTSTR转换成别的类型(包括unsigned char*,char*),所以,要把Cstring转换成其它类型,首先看这个类型是不是const char* 或者const short*,如果是,可以直接转,如果不是,首先转成LPCSTR或LPCTSTR,再把它们强制转换成相应的字符串类型.
而任何类型转换成Cstring,则需要在前面加上(CString)强制转换即可,或者用Cstring类的成员函数Format
三、VC中其它常用类型转换
其中,很多函数都用到<stdlib.h>和<wchar.h>,如果用到,要把头文件包含进源文件.
1.字符串转换成其它类型
Double atof(char* string);
Double wtof(const wchar_t* string);
int atoi(const char* string);
_int64 _atoi64(const char* string)
int wtoi(const wchar_t* string);
int64 wtoi64(const wchar_t* string);
long atol(const char* string);
long wtol(const wchar_t* string);
举例:。
char* s="-2309.12E-15";
double x=atof(s); //out:-2309120E-012
s="-9885 pigs";
int I=atoi(s); //out:-9885
``
2.其它类型转换成字符型:
char* itoa(int value,char* string,int radix);
char* i64toa(int64 value,char* string,int radix);
char* ui64toa(unsigned int64 value,char* string,int radix);
wchar_t * itow(int value, wchar_t string, int radix);
char* _ltoa(long value,char* string,int radix);
举例:`
```c
int i=100;
itoa(i,temp,10); //十进制
itoa(i,temp,2); //二进制
Cstring str;
Str.Fomat("%d",i); //整型to Cstring
Str.Format("%f",f); //Float to CString