CHAR、WCHAR、TCHAR、LPSTR和LPCSTR

在使用C++開發程序的時候,處理文本比較麻煩。主要是因爲歷史的緣由。C++對於字符的標註類型是char.可是沒有定義char的大小。默認爲一個字節,這樣就不能處理Unicode了。因此C++標準將這個問題留給了開發者。
微軟在使用C/C++的時候,爲了處理這個問題,就定義了幾個typedef。那就是CHAR、WCHAR、TCHAR、LPSTR和 LPCSTR,其中:
CHAR 表示一個字節的字符
WCHAR 表示兩個字節的字符
TCHAR 根據編譯條件可能爲CHAR,也可能爲WCHAR.
LPSTR和 LPCSTR 類型實際上是同樣的。都被定義爲 CHAR*. 也就是單字節字符串指針。其結尾處有一個'/0'表示字符結束。也就是C風格的字符串.
STL 推出後,又出來了一種新類型string.string 做爲C++的一級類型。咱們在代碼中應該首選使用。只有須要和舊代碼結合的地方纔使用C方式的字符串。
爲了和舊的C風格的字符串共同工做。STL中的string 提供了下面的方法:
const charT* c_str() const
const charT* data() const
size_type copy(charT* buf, size_type n, size_type pos = 0) const
其中:
1.c_str 直接返回一個以/0結尾的字符串。
2.data 直接以數組方式返回string的內容,其大小爲size()的返回值,結尾並無/0字符。
3.copy 把string的內容拷貝到buf空間中。
對於c_str() data()函數,返回的數組都是由string自己擁有,千萬不可修改其內容。其緣由是許多string實現的時候採用了引用機制,也就是說,有可能幾 個string使用同一個字符存儲空間。並且你不能使用sizeof(string)來查看其大小。詳細的解釋和實現查看 Effective STL的條款15: 當心string實現的多樣性
另外在你的程序中,只在須要時才使用c_str()或者data()獲得字符串,每調用一次,下次再使用就會失效,如:
 
string strinfo("this is Winter");
...
//最好的方式是:
foo(strinfo.c_str());
//也能夠這麼用:
const char* pstr=strinfo.c_str();
foo(pstr);
//不要再使用了pstr了, 下面的操做已經使pstr無效了。
strinfo += " Hello!";
foo(pstr);//錯誤!
會遇到什麼錯誤?當你幸運的時候pstr可能只是指向"this is Winter Hello!"的字符串,若是不幸運,就會致使程序出現其餘問題,總會有一些不可碰見的錯誤。總之不會是你預期的那個結果。 那麼若是已經有C風格字符串,若是轉化爲string 呢? 咱們經過看string.h,就會發現string 定義了構造方法和賦值操做符來完成這個過程。 basic_string(const _CharT* __f, const _CharT* __l, const allocator_type& __a = allocator_type()) basic_string& operator=(const _CharT* __s) basic_string& operator=(_CharT __c) 這樣string和原有類型的交互使用問題就解決了。
相關文章
相關標籤/搜索