国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
徹底理解C、C++、WIN32與COM中的字符串 - 鏡花水月 - JavaEye技術(shù)網(wǎng)站
C/C++中的字符串問(wèn)題在網(wǎng)上的講解一向非常含糊,存在各個(gè)層次的庫(kù)混用、濫用的情況,尤其是寬字符與窄字符等問(wèn)題很難找到有效的資料,本篇隨筆分享一下我長(zhǎng)期收集到的一些比較準(zhǔn)確的資料以及據(jù)此得到的個(gè)人理解.
C語(yǔ)言中的字符串
C語(yǔ)言中提供了兩種字符類型char和wchar_t,C語(yǔ)言使用字符數(shù)組來(lái)表示字符串,同時(shí)支持兩種直接量寫法:"abcd"和 L"abcd" 來(lái)表示字符串常量文字量,C語(yǔ)言允許用字符串常量來(lái)初始化字符串。標(biāo)準(zhǔn)C函數(shù)庫(kù)提供了printf和wprintf兩個(gè)版本的輸出函數(shù)。
C代碼
#include <stdio.h>
int main(){
char str[] = "abcd";
wchar_t wstr[] = L"abcd數(shù)學(xué)";
printf("%s\n",str);
wprintf(L"%s\n",wstr);
return 0;
}
#include <stdio.h>int main(){char str[] = "abcd";wchar_t wstr[] = L"abcd數(shù)學(xué)";printf("%s\n",str);wprintf(L"%s\n",wstr);return 0;}
純C語(yǔ)言環(huán)境下,可以使用兩個(gè)函數(shù)wcstombs和mbstowcs 來(lái)進(jìn)行寬窄字符串的互相轉(zhuǎn)換,下面一段是C語(yǔ)言中wcstombs的例子
C代碼
#include <stdio.h>
#include <stdlib.h>
int main(){
char str[] = "abcd";
wchar_t wstr[] = L"bcda";
wcstombs(str,wstr,sizeof(str));
printf("%s\n",str);
return 0;
}
#include <stdio.h>#include <stdlib.h>int main(){char str[] = "abcd";wchar_t wstr[] = L"bcda";wcstombs(str,wstr,sizeof(str));printf("%s\n",str);return 0;}
這兩個(gè)函數(shù)都聲明在C標(biāo)準(zhǔn)庫(kù)頭文件stdlib.h中。其它配套的字符串操作都在頭文件string.h和wchar.h.
C++語(yǔ)言中的字符串
C++中我們有了字符串類string和wstring,這兩個(gè)類都在頭文件string當(dāng)中,并且iostream中也提供了各自對(duì)應(yīng)版本的輸出流:
Cpp代碼
#include <string>
#include <iostream>
int main(){
std::string str = "abcd";
std::wstring wstr = L"abcd";
std::cout<<str<<std::endl;
std::wcout<<wstr<<std::endl;
return 0;
}
#include <string>#include <iostream>int main(){std::string str = "abcd";std::wstring wstr = L"abcd";std::cout<<str<<std::endl;std::wcout<<wstr<<std::endl;return 0;}
C++中轉(zhuǎn)換就很容易了,構(gòu)造字符串的時(shí)候把另一個(gè)的迭代器傳入就可以了:
Cpp代碼
#include <string>
#include <iostream>
int main(){
std::string str = "abcd";
std::wstring wstr(str.begin(),str.end());
std::wcout<<wstr<<std::endl;
return 0;
}
#include <string>#include <iostream>int main(){std::string str = "abcd";std::wstring wstr(str.begin(),str.end());std::wcout<<wstr<<std::endl;return 0;}
對(duì)于已經(jīng)存在的字符串,可以用assign來(lái)賦值。因?yàn)閷捵址行┱址袥]有的字符,所以當(dāng)你要指定一些轉(zhuǎn)換規(guī)則時(shí),可以使用頭文件algorithm中的transform函數(shù)。其它字符串相關(guān)操作也在頭文件string的類定義當(dāng)中。
Win32編程中的字符串
但是我們實(shí)際編程中,遇到字符集問(wèn)題比較多的情況是Win32編程。Win32SDK為了避免編譯器造成的差異,用宏定義了自己的一套類型系統(tǒng),其中字符類型就是CHAR和WCHAR,比較特別的是,Win32編程支持編譯時(shí)的Unicode和非Unicode指定,所以Win32SDK又提供了TCHAR類型,它會(huì)根據(jù)是否是Unicode環(huán)境自動(dòng)選擇CHAR或者WCHAR類型,沒有特別要求時(shí),我們一般應(yīng)該使用TCHAR。
CHAR和WCHAR的字面值分別是"abcd"和L"abcd",而TCHAR對(duì)應(yīng)的字面值是_T"abcd",或者TEXT("abcd")。
Win32類型系統(tǒng)中還定義了字符串類型,見下表:
 
PSTR  PCSTR  LPSTR  LPCSTR
PTSTR PCTSTR LPTSTR LPCTSTR
PWSTR PCWSTR LPWSTR LPCWSTR
其中我們把STR的前綴分成了不同的顏色,紅色前綴可能是P或者LP,P表示指針,LP表示長(zhǎng)整型指針。大部分系統(tǒng)中P和LP是同一類型,所以這個(gè)前綴是不會(huì)造成區(qū)別的,可能64位C++或者一些舊的16位C++環(huán)境中會(huì)有區(qū)別。
藍(lán)色前綴可能是C或者沒有,這個(gè)很簡(jiǎn)單,表示是否是常量指針。
粉色前綴可能是T、W或者沒有,這對(duì)應(yīng)著CHAR、WCHAR以及TCHAR。
對(duì)于轉(zhuǎn)換問(wèn)題,Windows提供了兩個(gè)API函數(shù),這里就不實(shí)際舉例了,具體請(qǐng)參看MSDN:
MultiByteToWideChar WideCharToMultiByte
其它與這些類型配套的Win32API函數(shù)請(qǐng)參看:MSDN中的參考
MFC中的CString類型提供了這些API的封裝,編程時(shí)使用可以省去不少麻煩。
COM中的字符串
COM中提供了一個(gè)BSTR類型,它是OLECHAR的字符串形式(OLECHAR可能是WCHAR或者CHAR,取決于系統(tǒng)的OLE字符集),很多人因?yàn)榭戳怂暮甓x:
typedef /* [wire_marshal] */ OLECHAR *BSTR;
認(rèn)為它只是簡(jiǎn)單的OLECHAR *甚至WCHAR*,但是并非如此。BSTR所指向的內(nèi)存地址前幾個(gè)字節(jié)也是被分配的空間,用于存儲(chǔ)BSTR的長(zhǎng)度等信息。所以BSTR對(duì)應(yīng)著一整套相關(guān)操作函數(shù):
SysAllocString
SysAllocStringByteLen
SysAllocStringLen
SysFreeString
SysReAllocString
SysReAllocStringLen
SysStringByteLen
SysStringLen
如果你在自己分配的WCHAR*上使用這些函數(shù),一定會(huì)導(dǎo)致問(wèn)題。同樣道理,如果你試圖用delete去釋放BSTR,也會(huì)造成錯(cuò)誤。但是有相當(dāng)一部分針對(duì)WCHAR的Win32API可以用在BSTR上。
好了,就這么多了,希望您讀了這篇隨筆以后能對(duì)各種環(huán)境中的字符串有個(gè)整體認(rèn)識(shí)。
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
徹底解密C 寬字符:3、利用C運(yùn)行時(shí)庫(kù)函數(shù)轉(zhuǎn)換
C++寬窄字符轉(zhuǎn)換代碼
寬字符串和標(biāo)準(zhǔn)字符串的互相轉(zhuǎn)換
也談C 中char*與wchar
【好】簡(jiǎn)單幾句話總結(jié)Unicode,UTF
淺談C中的wprintf和寬字符顯示
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服