天天看點

關于擷取字元串的長度

原文:http://blog.csdn.net/space_v/article/details/303418

我們可以呼叫

這時變數ilength将等於6,也就是字串中的字元數。

太好了!現在讓我們試著定義一個指向寬字元的名額:

再次呼叫strlen :

現在麻煩來了。首先,c編譯器會顯示一條警告消息,可能是這樣的内容:

'function' : incompatible types - from 'unsigned short *' to 'const char *'

這條消息的意思是:宣告strlen函式時,該函式應接收char類型的名額,但它現在卻接收了一個unsigned short類型的名額。您仍然可編譯并執行該程式,但您會發現ilength等於1。為什麼?

字串「hello!」中的6個字元占用16位元:

intel處理器在記憶體中将其存為:

假定strlen函式正試圖得到一個字串的長度,并把第1個位元組作為字元開始計數,但接著假定如果下一個位元組是0,則表示字串結束。

這個小練習清楚地說明了c語言本身和執行時期程式庫函式之間的差別。編譯器将字串l"hello!" 解釋為一組16位元短整數型态資料,并将其儲存在wchar_t陣列中。編譯器還處理陣列索引和sizeof操作符,是以這些都能正常工作,但在連結時才添加執行時期程式庫函式,例如strlen。這些函式認為字串由機關元組字元組成。遇到寬字串時,函式就不像我們所希望那樣執行了。

您可能要說:「噢,太麻煩了!」現在每個c語言程式庫函式都必須重寫以接受寬字元。但事實上并不是每個c語言程式庫函式都需要重寫,隻是那些有字串參數的函式才需要重寫,而且也不用由您來完成。它們已經重寫完了。

strlen函式的寬字元版是wcslen(wide-character string length:寬字串長度),并且在string.h(其中也說明了strlen)和wchar.h中均有說明。strlen函式說明如下:

而wcslen函式則說明如下:

這時我們知道,要得到寬字串的長度可以呼叫

函式将傳回字串中的字元數6。請記住,改成寬位元組後,字串的字元長度不改變,隻是位元組長度改變了。

您熟悉的所有帶有字串參數的c執行時期程式庫函式都有寬字元版。例如,wprintf是printf的寬字元版。這些函式在wchar.h和含有标準函式說明的表頭檔案中說明。

繼續閱讀