'冬瓜湯編寫整理 字符串處理,對于大部分語言來說,都是一件麻煩的事,ansi,unicode,utf-8……,我前面已經(jīng)說過了,F(xiàn)B對于unicode支持不是特別的好,也就是wstring只能是指針或固定長度,而不是動態(tài)不定長的字符串,這非常麻煩。雖然wstr()可以快速將string字符串轉變成wstring字符串,但其實很多場合下的使用,還是非常不方便。afx的CWstr類就是專門處理unicode字符串,其實用它可以處理ansi,unicode,utf-8,Bstr(vbstring),非常方便,不管是網(wǎng)絡上常用的utf-8,還是com的BSTR,都挺方便的。 一、len(),和sizeof()對字符串的影響 在FB中,len()用來判斷一個字符串的大小, 對于string和zstring來說,len返回的是字節(jié)大小。對于unicode來說,len()返回的是字符數(shù)。uniocde字符串的字節(jié)大小,是len(unicode)*2 。 而sizeof()是用來判斷一個變量,對象內存占用多少。 這是一個測試例子: #include once "afx/cwindow.inc" Dim As String anStr,anStrEN dim anStrU as string dim unStr as wstring*20 '這里直接用固定長度20個unicode字符 anStrEn = "FB is new basic" unstr = "FB是語言" anstr = "FB是語言" anStrU = wstr(anstr) afxmsg "ansi的Len大。" Len( anstr) chr(13) _ "ansi的sizeof大小:" sizeof(anstr) chr(13) _ "ansi純英文的Len大。" Len( anstrEn) chr(13) _ "ansi純英文的sizeof大。" sizeof(anstrEn) chr(13) _ "unicode的Len大。" len(unStr) chr(13) _ "uniocde的sizeof大。" sizeof(unStr) chr(13) _ "an轉Un的len大小:" len(anStrU) chr(13) _ "an轉Un的sizeof大。" sizeof(anStrU) chr(13) _ "wstr()返回值的Len大。" len(wstr(anstr)) chr(13) _ "wstr()返回值的sizeof大。" sizeof(wstr(anStr)) 在這里我們會發(fā)現(xiàn)sizeof對于string不起作用,總是返回大小12,這我無法解釋,只能把它理解成因為string是一個動態(tài)不定長的字符串數(shù)組,sizeof返回的實際上是一個數(shù)組結構的字節(jié)大小。如果用64位編譯,你會發(fā)現(xiàn)sizeof總是返回24。 (2)wstr(string)賦值給一個string類型的變量,不會發(fā)現(xiàn)任何變化。 (3) sizeof(wstr())總是返回0,估計是一個Null值。 所以在實際使用中如果要預先分配內存的話,千萬要小心不要誤以為sizeof(string)能返回總字節(jié)大小。 '冬瓜湯整理編寫 二、使用afx的字符串函數(shù) #include once "afx/CWSTR.inc" #include once "afx/afxStr.inc" using afx ' 所有的afx庫,都處在同一個命名空間afx里,F(xiàn)B的命名空間規(guī)則和c#/vb.net是一樣的。 '我不喜歡using這個關鍵詞,我更喜歡Imports,但沒辦法 import在FB很早以前就是一個關鍵字了。 '判斷是否是數(shù)字 Dim inNumeric As boolean=afxIsNumeric("-1395.43") '同left的用法 Dim As cwstr strLeft=afxstrClipLeft("這是一個Freebasic測試",9) '同mid的用法 Dim As cwstr strMid=afxstrClipMid("這是一個Freebasic測試",4,5) '同Right用法 Dim As cwstr strRight=afxstrClipRight("這是一個Freebasic測試",2) '左右嵌入空格或指定的符號 Dim As cwstr strCset=afxstrCset("單身狗",11,"*") '返回 ****單身狗**** '刪除指定數(shù)量的子字符串 Dim As cwstr strDelete=afxstrDelete("這是一個Freebasic測試",4,9) '從主字符串提取匹配指定字符的字符串,但不包括指定字符本身 Dim As cwstr strExtract=afxstrExtract(1,"誰是單身狗,不是單身貓","狗") ' Dim As cwstr strExtractAny=afxstrExtractAny(1,"誰是單身狗,不是單身貓","貓狗") '從指定位置插入子字符串 Dim As cwstr strInsert=afxstrInsert("01032547891","—",3) '從第三個位置之后插入子字符串 '同join用法 Dim cwsa As cwstrArray=cwstrArray(4,1) '建一個4行1列的數(shù)組 cwsa.Item(1) = "One" cwsa.Item(2) = "Two" cwsa.Item(3) = "Three" cwsa.item(4)="Four" DIM strJoinAS CWSTR = AfxStrJoin(cwsa, ",") '用法和vb的join一樣 '左邊加入指定數(shù)量的空格或指定符號 DIM strLset AS CWSTR = AfxStrLSet("FreeBasic", 20, "#") '解析帶分隔符的字符串,分隔符可以多種混用 DIM cws AS CWSTR = AfxStrParse("one,two,three", 2) ' Returns "two" DIM cws AS CWSTR = AfxStrParseAny("1;2,3", 2, ",;") ' Returns "2" '解析帶分隔符的字符串,并返回數(shù)量 DIM nCount AS LONG = AfxStrParseCount("one,two,three", ",") ' Returns 3 DIM nCount AS LONG = AfxStrParseCountAny("1;2,3", ",;") ' Returns 3 '返回子字符串第一次出現(xiàn)在主字符串位置之前的那部分字符串,可以指定搜索位置從哪里開始,默認從1 DIM cws AS CWSTR = AfxStrRemain("Brevity is the soul of wit", "is ") ' Returns "the soul of wit" DIM cws AS CWSTR = AfxStrRemainAny("I think, therefore I am", ",") ' Returns "therefore I am" '從主字符串移除子符串 DIM cws AS CWSTR = AfxStrRemove(" ", "[]") ' Returns "Hello" DIM cws AS CWSTR = AfxStrRemoveAny("abacadabra", "bac") ' Returns "dr" '替換,同Replace() DIM cws AS CWSTR = AfxStrReplace("Hello World", "World", "Earth") ' Returns "Hello Earth" DIM cws AS CWSTR = AfxStrReplaceAny("abacadabra", "bac", "*") ' Returns "*****d**r* '去掉主字符串不匹配指定的子符串的那部分,只返回匹配的子符串或子符串組 DIM cws AS CWSTR = AfxStrRetain("abacadabra","b") ' Returns "bb" DIM cws AS CWSTR = AfxStrRetainAny("1234567890ak;lk;l1234567890", ";/p") ' Returns ";;" '反轉字符串 DIM cws AS CWSTR = AfxStrReverse("garden") ' Returns "nedrag" '右邊添加指定數(shù)量的空格或指定符號 DIM cws AS CWSTR = AfxStrRSet("FreeBasic", 20, "*") '將帶各種不規(guī)范分隔符的字符串,整理成一種規(guī)范的字符串 DIM cws AS CWSTR = AfxStrShrink(",,, one , two three, four,", " ,")' Returns "one two three four" '同split DIM cws AS CWSTR = "- This, a sample string." DIM cwsa AS CWstrArray = AfxStrSplit(cws, " ,.-") FOR i AS LONG = cwsa.LBound TO cwsa.UBound PRINT cwsa.Item(i) NEXT '統(tǒng)計子符串在主子符串出現(xiàn)的次數(shù) DIM nCount AS LONG = AfxStrTally("abacadabra", "ab") ' Returns 2 DIM nCount AS LONG = AfxStrTallyAny("abacadabra", "bac") ' Returns 8 '在開頭和結尾,刪除成對的字符符號 AfxStrUnWrap("Paul", "", "") results Paul AfxStrUnWrap("'Paul'", "'") results Paul '確定主字符串是否包含指定子符串中任一一個字符 DIM nCount AS LONG = AfxStrVerify(5, "123.65,22.5", "0123456789") ' Returns 7 '在字符串開頭和結尾添加 成對的字符 AfxStrWrap('保羅',"", "")結果保羅 ……還有一些函數(shù),具體看幫助文檔 ########################################################### 三、使用BSTR 為了方便使用,我將Cbstr類和Cwstr類合并在同一個文件cwstr.inc中 #include once "afx/Cwstr.inc" using afx Dim myBstr as CBSTR myBstr="這是一個測試" 用 Cbstr類,主要是為了能夠自動釋放vbstring指針。忘記釋放bstr指針,是非常容易犯的錯。所以一遇到任何傳進來的bstr字符串 就立即用cbstr進行接收。