寬字符鏈接庫函數會出現錯誤

我們都知道如何獲得字符串的長度。例如,如果我們已經像下面這樣定義了一個字符串指針:
char * pc = "Hello!" ; iLength = strlen (pc) ;
這時變量iLength將等於6,也就是字符串中的字符數。 wchar_t * pw = L"Hello!" ;
再次呼叫strlen :
iLength = strlen (pw) ;
現在麻煩來了。首先,C編譯器會顯示一條警告消息,可能是這樣的內容:
'function' : incompatible types - from 'unsigned short *' to 'const char *'
這條消息的意思是:聲明strlen函數時,該函數應接收char類型的指標,但它現在卻接收了一個
unsigned short類型的指標。您仍然可編譯並執行該程序,但您會發現iLength等於1。爲什麼?
字符串「Hello!」中的6個字符佔用16位:
0x0048 0x0065 0x006C 0x006C 0x006F 0x0021
Intel處理器在內存中將其存爲:
48 00 65 00 6C 00 6C 00 6F 00 21 00
假定strlen函數正試圖得到一個字符串的長度,並把第1個字節作爲字符開始計數,但接着假定如果
下一個字節是0,則表示字符串結束。這個小練習清楚地說明了C語言本身和執行時期鏈接庫函數之間
的區別。編譯器將字符串L"Hello!" 解釋爲一組16位短整數型態數據,並將其保存在wchar_t數組中。
編譯器還處理數組索引和sizeof操作符,因此這些都能正常工作,但在連結時才添加執行時期鏈接庫
函數,例如strlen。這些函數認爲字符串由單字節字符組成。遇到寬字符串時,函數就不像我們所希
望那樣執行了。strlen函數的寬字符版是wcslen(wide-character string length:寬字符串長度),
並且在STRING.H(其中也說明了strlen)和WCHAR.H中均有說明。strlen函數說明如下:
size_t __cdecl strlen (const char *) ;
而wcslen函數則說明如下:
size_t __cdecl wcslen (const wchar_t *) ; iLength = wcslen (pw) ;
函數將返回字符串中的字符數6。請記住,改成寬字節後,字符串的字符長度不改變,只是位組長度改變了。
您熟悉的所有帶有字符串參數的C執行時期鏈接庫函數都有寬字符版。例如,wprintf是printf的寬字符版。
這些函數在WCHAR.H和含有標準函數說明的表頭文件中說明。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章