string也可以很精彩
//========================================================================
//TITLE:
//??? string也可以很精彩
//AUTHOR:
//??? norains
//DATE:
//??? Moday 03-November-2008
//Environment:
//??? NONE
//========================================================================
??? 對于習慣于MFC架構(gòu)的朋友來說,估計直接采用API方式寫代碼最痛苦的莫過于沒有CString。其實,在STL里面,我們依然還有std::string可用,雖然在某些程度中不及CString便利,但也能勉強聊勝于無了。
????
????
??? 1.宏定義
????
???? 在WinCE編程中,我們幾乎很少直接使用wchar_t,對于char也是如此。取而代之,我們更傾向于微軟的建議:TCHAR----沒辦法,誰讓wince是微軟的產(chǎn)品呢?但既然都已經(jīng)上了這賊船,那么我們不妨也入鄉(xiāng)隨俗一把,將std::string也做類似的定義吧:
?????
???? #ifdef UNICODE
???? ?#ifndef TSTRING
???? ??#define TSTRING std::wstring
???? ?#endif
???? #else
???? ?#ifndef TSTRING
???? ??#define TSTRING std::string
???? ?#endif
???? #endif
?????
???? 帶來的另外一個好處是,我們可以少敲打四次鍵盤。從延長鍵盤壽命的角度考慮,這也算是一大貢獻。好吧,為了我的鍵盤能夠服役得更久一些,接下來的內(nèi)容,我都會直接采用TSTRING替代。
?????
?????
??? 2.初始化
????
??? 初始化的方式多種多樣,一般會有如下:
??? TSTRING strA = TEXT("A");
??TSTRING strB(TEXT("B"));
??
??如果和容器打交道,那其實也很簡單:
??? std::vector<TCHAR> vtC(MAX_PATH,0);
??TSTRING strC(vtC.begin(),vtC.end());
??
??
??3.賦值
??
??初始化簡單,賦值也不會差哪里去:
??
??strA = TEXT("A2");
??TCHAR szB[] = TEXT("B2");
??strB = szB;
??
??和容器打交道,同樣也是簡單:
??strC = &vtC[0];
??
??
??4.追加
??
??讓我們回憶一下純粹用數(shù)組的日子,如果想要在一固定的數(shù)組后面追加字符串,那么我們首先要分配一個足夠大的空間,然后賦值舊的數(shù)值,最后再追加新值。也許很多人對下面這段偽代碼記憶猶新:
??
??TCHAR *pBuf;
??...??
??TCHAR *pNew = new TCHAR[_tcslen(pBuf) + TEXT("Append") + 1];
??_tcscpy(pNew,pBuf);
??_tcscat(pNew,TEXT("Append"));
??delete []pBuf;
??pBuf = pNew;
??
??呃,沒錯,的確如此,如果我們需要在一個數(shù)組末尾追加新值,這些麻煩的事情我們必須要親身經(jīng)歷的。還好,我們現(xiàn)在終于可以和這種折磨人的玩意說Goodbye了。對于string而言,追加新值?很簡單,就像JAVA一樣:
??strA += TEXT("Append");
??
??是的,你沒看錯,就是一條語句,再無別處。
??
??對于數(shù)組,對于容器,同樣如此:
??strB += szB;
??strC += &vtC[0];
??
??
??5.與API函數(shù)打交道
??
??Windows平臺的API函數(shù),自然是要照顧C的使用者。所以,可以這么說:大部分的API函數(shù),為了能夠在C中調(diào)用,基本上采用的都是C接口的寫法。而TSTRING,確切地說,是一個class,而不是一個value type,所以無法直接賦值。
??
??以CreateFile為例,其聲明如下:
??? HANDLE CreateFile(
??? LPCTSTR lpFileName,?
??? DWORD dwDesiredAccess,?
??? DWORD dwShareMode,?
??? LPSECURITY_ATTRIBUTES lpSecurityAttributes,?
??? DWORD dwCreationDisposition,?
??? DWORD dwFlagsAndAttributes,?
??? HANDLE hTemplateFile
??? );
??
??? 第一個參數(shù)是LPCTSTR,為一個指針,所以這樣直接賦值鐵定是通不過編譯的:
??? CreateFile(strA, ...);
????
??? 還好,偉大的STL構(gòu)建者已經(jīng)為我們考慮到了這個問題,我們只需要調(diào)用c_str函數(shù)即可:
??? CreateFile(strA.c_str(), ...);?????????
????
??? 類似,c_str還可以用在_tcslen,_tcscat等純粹的字符串函數(shù)。 ??
總結(jié)
以上是生活随笔為你收集整理的string也可以很精彩的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 人民币升破7关口是怎么回事?我们来聊一聊
- 下一篇: 写在S3C2440A平台+winCE5.