注册 登录
Office中国论坛/Access中国论坛 返回首页

ganlinlao的个人空间 http://www.office-cn.net/?230471 [收藏] [复制] [分享] [RSS]

日志

freebasic菜鸟初学Freebasic基础教程十一:使用afx库有关字符串的函数和类

已有 3855 次阅读2017-5-12 21:00 |个人分类:FreeBasic| Freebasic教程, Freebasic入门, Freebasic基础, Freebasic入门, Freebasic入门, Freebasic入门, Freebasic入门, Freebasic入门, Freebasic入门, Freebasic入门

       '冬瓜汤编写整理         
        字符串处理,对于大部分语言来说,都是一件麻烦的事,ansi,unicode,utf-8……,我前面已经说过了,FB对于unicode支持不是特别的好,也就是wstring只能是指针或固定长度,而不是动态不定长的字符串,这非常麻烦。虽然wstr()可以快速将string字符串转变成wstring字符串,但其实很多场合下的使用,还是非常不方便。afx的CWstr类就是专门处理unicode字符串,其实用它可以处理ansi,unicode,utf-8,Bstr(vbstring),非常方便,不管是网络上常用的utf-8,还是com的BSTR,都挺方便的。
         一、len(),和sizeof()对字符串的影响
         在FB中,len()用来判断一个字符串的大小,对于string和zstring来说,len返回的是字节大小。对于unicode来说,len()返回的是字符数。uniocde字符串的字节大小,是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))


                    在这里我们会发现sizeof对于string不起作用,总是返回大小12,这我无法解释,只能把它理解成因为string是一个动态不定长的字符串数组,sizeof返回的实际上是一个数组结构的字节大小。如果用64位编译,你会发现sizeof总是返回24。

                   (2)wstr(string)赋值给一个string类型的变量,不会发现任何变化。

                   (3) sizeof(wstr())总是返回0,估计是一个Null值。

                 所以在实际使用中如果要预先分配内存的话,千万要小心不要误以为sizeof(string)能返回总字节大小。

'冬瓜汤整理编写              

                  二、使用afx的字符串函数

#include once "afx/CWSTR.inc"

#include once "afx/afxStr.inc"

using afx      '所有的afx库,都处在同一个命名空间afx里,FB的命名空间规则和c#/vb.net是一样的。

                        '我不喜欢using这个关键词,我更喜欢Imports,但没办法 import在FB很早以前就是一个关键字了。

'判断是否是数字

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,"*")   '返回 ****单身狗****

'删除指定数量的子字符串

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列的数组
         cwsa.Item(1) = "One"
    cwsa.Item(2) = "Two"
    cwsa.Item(3) = "Three"
    cwsa.item(4)="Four"
DIM strJoinAS CWSTR = AfxStrJoin(cwsa, ",")   '用法和vb的join一样

'左边加入指定数量的空格或指定符号

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"

'解析带分隔符的字符串,并返回数量

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

'返回子字符串第一次出现在主字符串位置之前的那部分字符串,可以指定搜索位置从哪里开始,默认从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 "<;;>"

'反转字符串

DIM cws AS CWSTR = AfxStrReverse("garden")   ' Returns "nedrag"

'右边添加指定数量的空格或指定符号

DIM cws AS CWSTR = AfxStrRSet("FreeBasic", 20, "*")

'将带各种不规范分隔符的字符串,整理成一种规范的字符串

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

'统计子符串在主子符串出现的次数

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('保罗',"<", ">")结果<保罗>

……还有一些函数,具体看帮助文档

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

             三、使用BSTR

           为了方便使用,我将Cbstr类和Cwstr类合并在同一个文件cwstr.inc中

             #include once "afx/Cwstr.inc"

              using afx
               Dim   myBstr as CBSTR
               myBstr="这是一个测试"

               用 Cbstr类,主要是为了能够自动释放vbstring指针。忘记释放bstr指针,是非常容易犯的错。所以一遇到任何传进来的bstr字符串

            就立即用cbstr进行接收。

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-5-21 12:50 , Processed in 0.058214 second(s), 17 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

返回顶部