標籤:
(1)在win32編程中,如何使用string類型
#include <string>using namespace std;
LPTSTR lpCmdLine = L"hello world";
string cmd = lpCmdLine;
(2)字元格式設定基礎:
傳統的ansi字元在C語言中用char資料類型表示(1位元組)。在原始碼中聲明一個字串,則編譯器會轉換為由8位char資料類型構成的一個數組(以"/0"結尾)
char c=‘a‘;//一個8位的字元
char szbuffer[100]="a string";//含有99個8位字元和1個8位結束符(/0)的數組
微軟的c/c++編譯器為unicode定義了一個內建的資料結構,wchar_t,它表示一個16位的unicode(UTF-16)字元。
wchar_t c=L‘a‘;//一個16位的字元
wchar_t szbuffer[100]=L"a string";//含有99個16位字元和1個16位結束符(/0)的數組
字串比較函數:
if (_stricmp("hello world", cmd.c_str()) == 0){}
lstrcmp 對兩個字串進行區分大小寫比較
lstrcmpi 對兩個字串進行不區分大小寫比較
(3)C運行庫中的安全字串處理函數
通常,修改字串的函數都存在一個安全隱患,即目標字串的緩衝不夠大,則會導致記憶體中的資料被破壞。
例如:
WCHAR szbuffer[3]=L"";
wcscpy(szbuffer,L"abc");
以上的例子是以0結尾的,需要szbuffer[4]才可以容納。但編譯時間並不會有任何報錯或警告。
針對以上問題,我們必須使用“安全字串處理函數”,這一類的函數以_s結尾(secure之意),我們來看一下這類函數的原型.
PTSTR _tcscpy(PTSTR strDestination,PCTSTR strSource);
errno_t _tcscpy_s(PTSTR strDestination,size_t numberOfCharacters,PCTSTR strSource);
PTSTR _tcscat(PTSTR strDestination,PCTSTR strSource);
errno_t _tcscat_s(PTSTR strDestination,size_t numberOfCharacters,PCTSTR strSource);
可以看到,在將一個緩衝區作為目標緩衝區時,必須提供這個緩衝區的大小(可容納的字元個數),通過調用_countof宏計算出來。
這個緩衝區大小參數的主要任務就是驗證緩衝區是否足以容納結果資料.
現在,我們調用這些安全函數的時候,就可以檢查返回的errno_t值。只有返回S_OK值,才表明函數調用成功。其他的值可以參照errno.h中的定義。
來看一個例子:
TCHAR szbuffer[3]=L"";
_tcscpy_s(szbuffer,_countof(szbuffer),_T("abc"));
執行完後, szbuffer的第一個字元被設定為‘/0‘,而其他所有位元組全部被設定為0xfd(填充符)。
(4)c運行庫增加的函數:控制如何截斷字串
這類函數具有兩個版本,對應ansi和unicode。
HRESULT StringCchCat( LPTSTR pszDest,size_t cchDest,LPCTSTR pszSrc);HRESULT StringCchCatEx( LPTSTR pszDest,size_t cchDest, LPCTSTR pszSrc,LPTSTR *ppszDestEnd,size_t *pcchRemaining,DWORD dwFlags); HRESULT StringCchCopy( LPTSTR pszDest,size_t cchDest, LPCTSTR pszSrc);HRESULT StringCchCopyEx(LPTSTR pszDest,size_t cchDest, LPCTSTR pszSrc, LPTSTR *ppszDestEnd,size_t *pcchRemaining,DWORD dwFlags);
可以看出,在所有方法的名稱中,都含有一個“Cch”,這表示count of characters,即字元個數。通常使用_countof宏獲得。
另外還有一些函數含有“cb”,這表示函數要求用位元組數來指定大小。通常使用sizeof()獲得。
這些函數返回HRESULT,具體的值
| S_OK |
成功。目標緩衝區中包含源字串,並以/0終止 |
| STRSAFE_E_INVALID_PARAMETER |
失敗。將NULL傳給了一個參數 |
| STRSAFE_E_INSUFFICIENT_BUFFER |
失敗。指定的目標緩衝區太小,無法容納整個源字串 |
不同於安全字串處理函數,這類函數運行時,當緩衝區太小,則會執行截斷。
(5)windows字串處理函數
在shlwapi.h定義了大量好用的字串函數,可以用來對作業系統有關的數值進行格式化操作。
例如,比較兩個字串是否相等:對於這樣的需求可以使用CompareString(Ex)或者CompareStringOrdinal。
CompareString(Ex)一般用於向使用者顯示的字串。
CompareStringOrdinal一般用於比較程式內部的字串,如路徑名,登錄機碼值等。
CompareString(Ex)的處理速度相對於CompareStringOrdinal較慢。
這兩個函數的返回0,則表示調用失敗;
返回1(CSTR_LESS_THAN)表明string1小於string2;
返回2(CSTR_GREATER_THAN)表明string1大於string2.
(6)推薦的字元處理方式
1、使用通用資料類型和宏,如TCHAR和_T
2、將字串想象成字元的數組,而非char或位元組的數組。
3、與字串有關的計算需修改。尤其要搞清楚很多的函數要求傳遞的是字元數還是位元組數,如是前者,則用_countof()擷取;如是後者,則用(字元數*sizeof(字元類型))擷取。
4、避免使用printf系列函數轉換ansi和unicode。正確的做法是使用MultiByteToWideChar或WideCharToMultiByte。
5、始終使用安全的字串處理函數,_s或stringcch,如要控制截斷,則使用後者。
6、如果一個緩衝區處理函數的參數中不包括目標緩衝區的長度,那麼避免使用。
7、比較字串時,使用CompareStringOrdina和CompareString(Ex)。前者速度快,適合處理常式內部的字串;後者用於處理UI的字串,因為它是以地區設定來適當排序,速度較慢。
轉自http://blog.csdn.net/shentao17792/article/details/5314312
Windows 編 程中的字串