注冊 登錄
Office中國論壇/Access中國論壇 返回首頁

ganlinlao的個(gè)人空間 http://m.mzhfr.cn/?230471 [收藏] [復(fù)制] [分享] [RSS]

日志

freebasic菜鳥初學(xué)Freebasic基礎(chǔ)教程十一:使用afx庫有關(guān)字符串的函數(shù)和類

已有 4300 次閱讀2017-5-12 21:00 |個(gè)人分類:FreeBasic| Freebasic教程, Freebasic入門, Freebasic基礎(chǔ), Freebasic入門, Freebasic入門, Freebasic入門, Freebasic入門, Freebasic入門, Freebasic入門, Freebasic入門

       '冬瓜湯編寫整理         
        字符串處理,對于大部分語言來說,都是一件麻煩的事,ansi,unicode,utf-8……,我前面已經(jīng)說過了,F(xiàn)B對于unicode支持不是特別的好,也就是wstring只能是指針或固定長度,而不是動(dòng)態(tài)不定長的字符串,這非常麻煩。雖然wstr()可以快速將string字符串轉(zhuǎn)變成wstring字符串,但其實(shí)很多場合下的使用,還是非常不方便。afx的CWstr類就是專門處理unicode字符串,其實(shí)用它可以處理ansi,unicode,utf-8,Bstr(vbstring),非常方便,不管是網(wǎng)絡(luò)上常用的utf-8,還是com的BSTR,都挺方便的。
         一、len(),和sizeof()對字符串的影響
         在FB中,len()用來判斷一個(gè)字符串的大小,對于string和zstring來說,len返回的是字節(jié)大小。對于unicode來說,len()返回的是字符數(shù)。uniocde字符串的字節(jié)大小,是len(unicode)*2。
         而sizeof()是用來判斷一個(gè)變量,對象內(nèi)存占用多少。
        這是一個(gè)測試?yán)樱?              
#include once "afx/cwindow.inc"
Dim  As String anStr,anStrEN
dim  anStrU as string
dim  unStr as  wstring*20    '這里直接用固定長度20個(gè)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轉(zhuǎn)Un的len大小:" & len(anStrU) &chr(13) &_
                "an轉(zhuǎn)Un的sizeof大。" & sizeof(anStrU) &chr(13) &_
                 "wstr()返回值的Len大。" & len(wstr(anstr)) & chr(13) &_
                 "wstr()返回值的sizeof大小:" & sizeof(wstr(anStr))


                    在這里我們會(huì)發(fā)現(xiàn)sizeof對于string不起作用,總是返回大小12,這我無法解釋,只能把它理解成因?yàn)閟tring是一個(gè)動(dòng)態(tài)不定長的字符串?dāng)?shù)組,sizeof返回的實(shí)際上是一個(gè)數(shù)組結(jié)構(gòu)的字節(jié)大小。如果用64位編譯,你會(huì)發(fā)現(xiàn)sizeof總是返回24。

                   (2)wstr(string)賦值給一個(gè)string類型的變量,不會(huì)發(fā)現(xiàn)任何變化。

                   (3) sizeof(wstr())總是返回0,估計(jì)是一個(gè)Null值。

                 所以在實(shí)際使用中如果要預(yù)先分配內(nèi)存的話,千萬要小心不要誤以為sizeof(string)能返回總字節(jié)大小。

'冬瓜湯整理編寫              

                  二、使用afx的字符串函數(shù)

#include once "afx/CWSTR.inc"

#include once "afx/afxStr.inc"

using afx      '所有的afx庫,都處在同一個(gè)命名空間afx里,F(xiàn)B的命名空間規(guī)則和c#/vb.net是一樣的。

                        '我不喜歡using這個(gè)關(guān)鍵詞,我更喜歡Imports,但沒辦法 import在FB很早以前就是一個(gè)關(guān)鍵字了。

'判斷是否是數(shù)字

Dim inNumeric As boolean=afxIsNumeric("-1395.43")

'同left的用法

Dim As cwstr strLeft=afxstrClipLeft("這是一個(gè)Freebasic測試",9)

'同mid的用法

Dim As cwstr strMid=afxstrClipMid("這是一個(gè)Freebasic測試",4,5)

'同Right用法

Dim As cwstr strRight=afxstrClipRight("這是一個(gè)Freebasic測試",2)

'左右嵌入空格或指定的符號

Dim As cwstr strCset=afxstrCset("單身狗",11,"*")   '返回 ****單身狗****

'刪除指定數(shù)量的子字符串

Dim As cwstr strDelete=afxstrDelete("這是一個(gè)Freebasic測試",4,9)

'從主字符串提取匹配指定字符的字符串,但不包括指定字符本身

Dim As cwstr strExtract=afxstrExtract(1,"誰是單身狗,不是單身貓","狗")  '
Dim  As cwstr strExtractAny=afxstrExtractAny(1,"誰是單身狗,不是單身貓","貓狗") 

'從指定位置插入子字符串

Dim  As cwstr strInsert=afxstrInsert("01032547891","—",3)     '從第三個(gè)位置之后插入子字符串

'同join用法

Dim cwsa As cwstrArray=cwstrArray(4,1)       '建一個(gè)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"

'解析帶分隔符的字符串,并返回?cái)?shù)量

DIM nCount AS LONG = AfxStrParseCount("one,two,three", ",")   ' Returns 3
DIM nCount AS LONG = AfxStrParseCountAny("1;2,3", ",;")   ' Returns 3

'返回子字符串第一次出現(xiàn)在主字符串位置之前的那部分字符串,可以指定搜索位置從哪里開始,默認(rè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("[]Hello[]", "[]")   ' 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("1234567890<ak;lk;l>1234567890", "<;/p>")   ' Returns "<;;>"

'反轉(zhuǎn)字符串

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)計(jì)子符串在主子符串出現(xiàn)的次數(shù)

DIM nCount AS LONG = AfxStrTally("abacadabra", "ab")   ' Returns 2
DIM nCount AS LONG = AfxStrTallyAny("abacadabra", "bac")   ' Returns 8

'在開頭和結(jié)尾,刪除成對的字符符號

AfxStrUnWrap("<Paul>", "<", ">") results  Paul
AfxStrUnWrap("'Paul'", "'") results  Paul

'確定主字符串是否包含指定子符串中任一一個(gè)字符

DIM nCount AS LONG = AfxStrVerify(5, "123.65,22.5", "0123456789")   ' Returns 7

'在字符串開頭和結(jié)尾添加  成對的字符

AfxStrWrap('保羅',"<", ">")結(jié)果<保羅>

……還有一些函數(shù),具體看幫助文檔

###########################################################

             三、使用BSTR

           為了方便使用,我將Cbstr類和Cwstr類合并在同一個(gè)文件cwstr.inc中

             #include once "afx/Cwstr.inc"

              using afx
               Dim   myBstr as CBSTR
               myBstr="這是一個(gè)測試"

               用 Cbstr類,主要是為了能夠自動(dòng)釋放vbstring指針。忘記釋放bstr指針,是非常容易犯的錯(cuò)。所以一遇到任何傳進(jìn)來的bstr字符串

            就立即用cbstr進(jìn)行接收。

評論 (0 個(gè)評論)

facelist doodle 涂鴉板

您需要登錄后才可以評論 登錄 | 注冊

QQ|站長郵箱|小黑屋|手機(jī)版|Office中國/Access中國 ( 粵ICP備10043721號-1 )  

GMT+8, 2025-7-13 03:06 , Processed in 0.078168 second(s), 17 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

返回頂部