MFC下的各種字串型別和相互轉換

2021-06-26 20:22:40 字數 3454 閱讀 5757

l:long

長  p:point  指標  c:const  常量  w:wchar_t  寬字元  t:tchar   str:string  字串

在看看mfc下各種資料型別的定義:

1     typedef char *lpstr;

2 typedef const

char *lpcstr;

34 typedef wchar_t *lpwstr;

5 typedef const wchar_t *lpcwstr;

6typedef wchar_t wchar;78

#ifdef unicode

9typedef lpcwstr lpctstr;

10typedef wchar tchar;

1112

#else

13typedef lpcstr lpctstr;

14 typedef char tchar;

mfc下提供的atl 轉換巨集:

t2a  t2w  t2ca t2cw         w2a  w2ca w2t  w2ct         a2w  a2cw a2t  a2ct 

t:tchar  2:to  c:const  a:char(ansi)  w:wchar

先到atlconv.h標頭檔案下看看這些巨集的定義,

1.uses_conversion:注意int _convert; (_convert);這種用法是為了遮蔽編譯器的警告:未引用的區域性變數。。。

#ifndef _debug

#define uses_conversion int _convert; (_convert); uint _acp = atl::_atlgetconversionacp() /*cp_thread_acp*/; (_acp); lpcwstr _lpw; (_lpw); lpcstr _lpa; (_lpa)

#else

#define uses_conversion int _convert = 0; (_convert); uint _acp = atl::_atlgetconversionacp() /*cp_thread_acp*/; (_acp); lpcwstr _lpw = null; (_lpw); lpcstr _lpa = null; (_lpa)

#endif

可見,uses_conversion巨集定義了一些轉換所需要的變數,如_convert。所以使用那些巨集的時候必須加上該巨集。

2.a2w:這裡就用到了uses_conversion巨集定義的_convert變數

1

#define a2w(lpa) (\

2 ((_lpa = lpa) == null) ?null : (\

3 _convert = (lstrlena(_lpa)+1

),\4 (int_max/2

<_convert :>

5 atla2whelper((lpwstr) alloca(_convert*sizeof(wchar)), _lpa, _convert, _acp)))

3.atla2whelper

1

#define atla2whelper atla2whelper

4.atla2whelper:實際上還是在呼叫multibytetowidechar,即多位元組轉換為寬位元組

1  _ret_opt_z_cap_(nchars) inline lpwstr winapi atla2whelper(_out_z_cap_(nchars) lpwstr lpw, _in_z_ lpcstr lpa, _in_ int nchars, _in_ uint acp) throw()2

14return

lpw;

15 }

5.alloca

#define alloca  _alloca
6._alloca:該函式從堆上分配以位元組為單位的記憶體,返回void *

1

void *_alloca(

2size_t size

3 );

使用方法舉例:

1  uses_conversion;//uses_conversion是atl中的乙個巨集定義,用於編碼轉換,它定義了轉換巨集所需的一些區域性變數

23 wchar *pwch = l"

wchar* to char*";

4 char *pch =w2a(pwch);

56 tchar *ptch = _t("

tchar* to char*");

7 char *pch2 = t2a(ptch);

使用uses_conversion一定要小心,它們從堆疊上分配記憶體,直到呼叫它的函式返回,該記憶體不會被釋放。如果在乙個迴圈中,這個巨集被反覆呼叫幾萬次,將不可避免的產生stackoverflow。

但是考慮到棧空間的尺寸( 預設2m),使用時要注意幾點:

1、只適合於進行短字串的轉換;

2、不要試圖在乙個次數比較多的迴圈體內進行轉換;

3、不要試圖對字元型檔案內容進行轉換,因為檔案尺寸一般情況下是比較大的;

4、對情況 2 和 3,要使用 multibytetowidechar() 和 widechartomultibyte();

參見5、將字元轉換封裝到函式裡面

1

void

doa2w()

2

除此之外,還可以使用c語言提供的函式:

1

char * pstr = "

abc";2

3 size_t nlen = _mbstrlen(pstr) + 1;4

//也可以用mbstowcs(null, pstr, 0);,第乙個和第三個引數為空即得到非空字元的長度

56 wchar_t * pwstr = new

wchar_t[nlen];

7 mbstowcs(pwstr, pstr, nlen);//

multibyte string to widechar string

89 size_t nwlen = wcslen(pwstr) + 1;//

wcstombs(null, pwstr, 0)

10char *pstr2 = new

char

[nwlen];

11 wcstombs(pstr2, pwstr, nwlen);//

widechar string to multibyte string

1213

delete pwstr;

14 pwstr =null;

1516

delete pstr2;

17 pstr2 = null;

MFC下的各種字串型別和相互轉換

mfc下的常用字串資料型別表示的含義 l long 長 p point 指標 c const 常量 w wchar t 寬字元 t tchar str string 字串 在看看mfc下各種資料型別的定義 1 typedef char lpstr 2 typedef const char lpcst...

基本型別和字串型別之間的相互轉換

1 string型別轉基本型別 除了character外,所有基本型別包裝類,都提供了乙個par xx string s 和valueof string s 的靜態方法把特定字串轉化為基本型別變數。如 a0和a1都是整數123 2 基本型別轉string型別 string中有很多過載的valueof...

QString string和C字串相互轉換

std string轉換成qstring string std str abc qstring q str qstring fromstdstring std str qstring轉換成std string qstring q str abc string q str.tostdstring st...