VC的字符串處理


http://hi.baidu.com/nmn714/item/ab8d2a96d0f2d6f228164727


貌似不少人剛開始做windows程序時都會糾結在字符串處理上,所以我把關於字符串處理的個人心得總結一下。

首先,char是ascii編碼,wchar_t是unicode,這是大家都知道的,但是這也是糾結所在。所以個人經驗,在做windows程序時,最好是忘記這兩種變量的存在,而記住windows裏只有一種字符變量,那就是TCHAR。(雖然TCHAR只不過是對char或tchar的宏定義而已)

也就是說,程序裏既不要出現char也不要出現wchar,只能出現TCHAR,這樣就把糾結統一起來了。這也是程序通用性的要求。


接下來,還必須注意以下幾點:

1、既然程序裏不能出現char,那表示字符串時,就不能再習慣性的用char*了。應該改爲TCHAR*,或者是PTSTR。後一種是windows的變量,類似的有:PSTR、PTSTR、LPTSTR、LPSTR、PCTSTR等等等等。這也是讓人一開始接觸會頭大的地方。其實並非如此恐怖,我以PCTSTR爲例做個解釋:P代表指針(和LP是一個東西,LP的本意是Long Pointer,16位windows時代的遺留物。),C代表const,T代表TCHAR,STR代表字符串。所以PCTSTR其實就是const TCHAR* 的意思。而PSTR也就是char* 的意思。所以我們在表示字符串時也不能使用PSTR等不帶T的變量類型名。


2、表示字符串常量時,不能簡單的用雙引號括起來,因爲那代表ascii字符串。同樣也不能在前面加L,因爲那代表unicode。我們的程序要做到的是通用性,即不是ascii也不是unicode。所以我們在字符串前應該加的是TEXT, 比如MessageBox(NULL, TEXT("Fypher"), TEXT("Fypher"), MB_OK)。TEXT還可用於字符。比如TCHAR m=TEXT('A');


3、TCHAR tchTest[50]。tchTest能裝多少字符?哈!不要習慣性的sizeof(tchTest)了,應該_countof(tchTest)或者sizeof(tchTest)/sizeof(TCHAR)。因爲我們不確定TCHAR到底是char 還是 wchar_t。


4、該和一堆老朋友說再見了……我們不能再使用以前的字符串處理函數或者字符處理函數了。比如strlen、strcat、strcmp等等等等……因爲這些是ascii專用的,通通改成使用T家族的吧。前綴都換成_tcs。比如_tcslen、_tcscat、_tcscmp等等……順便補充一下wcs前綴是wchar_t使用的。恩,還有大家用得超爽的sprintf,今後就改成_stprintf了吧~呵呵。補充:swprintf是wchar_t它家的。對了,windows認爲_tcscpy、_tcscat等不安全,所以使用這些函數編譯器會報警。可以改用windows推出的_tcscpy_s、_tcscat_s等“安全”函數,其實就是多了個參數用來指明緩衝區大小(記得用_countof哦!^_^)。windows還推出了形如StringCchCat的一套字符串處理函數,我沒怎麼用過。windows也有一個字符串比較函數CompareString。功能比_tcscmp強大多了。比如可以設置忽略大小寫等。


5、IsTextUnicode函數可以用過一系列統計學的方法判斷某個字符串是不是unicode字符串。MultiByteToWideChar和WideCharToMultiByte函數可實現Ascii和Unicode字符串的相互轉化。這些的使用場合都不大。因爲我們的程序應該做到“沒有”ascii和unicode。


6、恩,雖然絕大多數情況下應該使用TCHAR,但是記住GetProcAdress這個特殊的函數吧,它的參數只能是char*。因爲在導出函數表裏函數名是用ascii碼寫的……

7、最後一點,記得要#include <tchar.h>,呵呵。 由於windows內核採用的是UNICODE,UNICODE版的程序必然比ASCII版的程序效率高(比如不用在調用函數時在堆裏分配空間把參數轉成UNICODE,然後再調用UNICODE版的函數),所以我們最好是在程序的開頭加上#define UNICODE和#define _UNICODE,把程序轉換成UNICODE版的。如果程序的字符串處理完全按照上面的通用性要求做了是不會出錯的。

恩,就這些了,呵呵。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章