VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)

VB爱好者乐园(VBGood)

 找回密码
 立即注册
搜索
楼主: 6500K

去掉字符串尾巴chr(0)等等的最好的方法,今天又看到了,分享一下

  [复制链接]
发表于 2011-4-23 11:15:11 | 显示全部楼层
本帖最后由 guanyouan 于 2011-4-23 11:16 编辑

Function trimterm(src As String) As String
    Dim lPos As Long

    lPos = InStr(1, src, vbNullChar)
    If lPos = 0 Then
        trimterm = src
    ElseIf lPos > 1 Then
        trimterm = Left(src, lPos - 1)
    End If
End Function

我程序一直用的函数,我觉得还是这样在VB语句里效率高也是安全的。假设整个字符串都是vbNullChar,5楼的代码,如果Left传-1会出错那就会出错了
PS:楼主,代码效率不是写的字符数就是最快的。当然了也看你喜欢

点评

同意,不过一般我连函数都不写,直接把这个类似的代码写到程序里面的……  发表于 2011-4-23 13:09
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-4-23 14:53:32 | 显示全部楼层
本帖最后由 6500K 于 2011-4-23 15:50 编辑
xtaxa 发表于 2011-4-23 01:31
经过测试,当字符串为""时,split要报错
Left(Windir,-1) 也要报错
s = IIf(s = "", "", Split(s, Chr(0) ...


那就写成这样没必要重新赋值
If txt<>vbNullString then txt= split(txt, chr$(0),2)(0)

平时都指定了长度才挂到API去的,碰到没有chr(0)的, 没碰到过完全空的情况。只是没想到,我晕喔,IIf不靠谱呢...

点评

好在字符串不会全空的,因为你调用API之前字符串有多长,调用结束之后还是有多长……  发表于 2011-4-23 21:40
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-4-23 14:56:26 | 显示全部楼层
WAWSF 发表于 2011-4-22 23:34
你用函数多我也只要多写一句代码而已
TEXT1.TEXT=P
P=TEXT1.TEXT

挂到VB6的控件中去这绝对是错的,碰到Unicode的字符,你该怎么办?
拿回一堆问号?

点评

正解,不过要是真的碰到Unicode字符串的话,想显示这些字符串出来都是一个问题……  发表于 2011-4-23 21:39
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-4-23 15:36:31 | 显示全部楼层
本帖最后由 6500K 于 2011-4-23 15:37 编辑
guanyouan 发表于 2011-4-23 11:15
Function trimterm(src As String) As String
    Dim lPos As Long


的确这样写效率是最高的,毕竟你只拿一个。
split二头兼顾都要分配一下,所以速度会慢1/2。

但当然,这种效率上的差别需要百万级以上长度的字符串...才会有比较明显的差别。各取所需吧。
回复 支持 反对

使用道具 举报

发表于 2011-4-24 12:38:48 | 显示全部楼层
回复 6500K 的帖子

请问一下iif为何不靠谱呀,我的程序只要涉及两者判断都用的iif:
FrmMain.mnuHotKey.Caption = IIf(Lang, "Reboot hotkey", "重启快捷键")
我觉得很方便啊
能详细的讲解一下iif的坏处吗

点评

IIf三个变量全都是Variant类型,运行效率比较低……  发表于 2011-4-24 16:35
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-4-24 12:53:14 | 显示全部楼层
a150047 发表于 2011-4-24 12:38
回复 6500K 的帖子

请问一下iif为何不靠谱呀,我的程序只要涉及两者判断都用的iif:

如果要提高效率和避免错误,避免If后面的语句被执行,就不要用IIF。
也就是说IIf更适合直接赋值,尽量不要在IIf里面再运算一下...

这样的语句是通不过的
Dim i As Integer
Debug.Print IIf(i <> 0, 1 / i, 1 + i)
回复 支持 反对

使用道具 举报

发表于 2011-6-17 21:18:50 | 显示全部楼层
本帖最后由 dolphins 于 2011-6-17 21:19 编辑

大概使用API返回字符串才要要去掉chr(0),如果API返回长度的,那就直接用返回的长度,不提供长度的,推荐用lstrlen
举个例子,获取计算机名称
  1. Option Explicit
  2. Private Declare Function GetComputerName Lib "kernel32" Alias "GetComputerNameW" (ByVal lpBuffer As Long, lpnSize As Long) As Long
  3. Private Const MAX_COMPUTERNAME_LENGTH = 31
  4. '#ifndef _MAC
  5. '#define MAX_COMPUTERNAME_LENGTH 15
  6. '#Else
  7. '#define MAX_COMPUTERNAME_LENGTH 31
  8. '#End If

  9. Private Sub Form_Load()
  10.     Dim S As String
  11.     Dim L As Long
  12.     L = MAX_COMPUTERNAME_LENGTH + 1
  13.     S = String(L, vbNullChar)
  14.     GetComputerName StrPtr(S), L
  15.     Debug.Print Mid(S, 1, L)
  16. End Sub
复制代码
这种情况如果再instr、split、 replace之类的不是多此一举么?

点评

lstrlen比InSte要慢,因为调用lstrlen需要额外转换编码……  发表于 2011-6-20 15:33
直接用API提供的长度开销最小,而用lstrlen省代码……  发表于 2011-6-18 09:37
API调用开销比InStr还要大……  发表于 2011-6-17 22:32
回复 支持 反对

使用道具 举报

发表于 2011-6-20 14:38:43 | 显示全部楼层
我大胆的说这个方法不是最好的,只是最偷懒的
有写时候还是得老老实实的InStr...
回复 支持 反对

使用道具 举报

发表于 2011-6-20 16:57:04 | 显示全部楼层
acme_pjz  lstrlen比InSte要慢,因为调用lstrlen需要额外转换编码……  发表于 1 小时前
我没怀疑Instr的速度,我的意思是可以什么都不用,因为大部分情况下都会返回长度值。

点评

而且传给另一个UNICODE API的话,可以不去掉chr(0)后面的东西,直接传  发表于 2011-6-21 09:29
回复 支持 反对

使用道具 举报

发表于 2011-6-22 10:20:09 | 显示全部楼层
修改如下
pathname   =   Split(pathname & chr(0),   Chr$(0))(0)

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

文字版|手机版|小黑屋|VBGood  

GMT+8, 2022-7-3 17:15

VB爱好者乐园(VBGood)
快速回复 返回顶部 返回列表