关于字符串的无缝合并,请高手指点。

aikill 2006-08-07 03:04:46
Dim strOne As String
Dim strTwo As String
Dim strThree As String
Dim strFour As String

strOne = "I"
strTwo = " love "
strThree = "csdn ."

'这样赋值strFour中的字符串不在连续的内存块中。
strFour = strOne & strTwo & strThree

'求如何使三个值合并到一个连续的内存块中,并赋值给strFour
'我用CopyMemory操作,一直不能得到正确的值。看来对这个函数还是理解的不够透彻,请指教!
...全文
235 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
boywang 2006-08-08
  • 打赏
  • 举报
回复
Option Explicit

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)

Public Sub xx()
Dim strOne As String
Dim strTwo As String
Dim strThree As String
Dim strFour As String
Dim a(30) As Byte
strFour = "1"

strOne = "I"
strTwo = " love "
strThree = "csdn ."
strOne = StrConv(strOne, vbFromUnicode)
strTwo = StrConv(strTwo, vbFromUnicode)
strThree = StrConv(strThree, vbFromUnicode)

Call CopyMemory(a(0), ByVal StrPtr(strOne), 1)
'MsgBox Chr(a(0))
Call CopyMemory(a(1), ByVal StrPtr(strTwo), 6)
'MsgBox Chr(a(2))
Call CopyMemory(a(7), ByVal StrPtr(strThree), 6)
'MsgBox Chr(a(12))

'CopyMemory ByVal StrPtr(strFour), a(0), 30
strFour = StrConv(a, vbUnicode)

MsgBox strFour
End Sub

Private Sub Form_Load()
xx
End Sub



strFour = "1"用来给strfour的指针初始化。
boywang 2006-08-08
  • 打赏
  • 举报
回复
变长strfour的指针值为0,会引起内存访问错误的。
aikill 2006-08-08
  • 打赏
  • 举报
回复
明白了,散分。谢谢各位!
VBAHZ 2006-08-08
  • 打赏
  • 举报
回复
//'这样赋值strFour中的字符串不在连续的内存块中。
//strFour = strOne & strTwo & strThree

//搞错了,向大家道歉,原来是会换行,而不能确定地址不连续.
//继续问题,全部都是变长时,怎么写?

若若的问一句,上面大家这么狂用API在干什么?
好像VB是重新自动分配连续内存给strFour的,

以LZ的要求:如何使三个值合并到一个连续的内存块中,并赋值给strFour

这样不行吗?
strFour = strOne & strTwo & strThree
aikill 2006-08-07
  • 打赏
  • 举报
回复
搞错了,向大家道歉,原来是会换行,而不能确定地址不连续.
继续问题,全部都是变长时,怎么写?
aikill 2006-08-07
  • 打赏
  • 举报
回复
to:province_(雍昊)
strconv也达不到效果。
aikill 2006-08-07
  • 打赏
  • 举报
回复
试试WM_SETTEXT就知道了,唯一的解释就是地址不连续。
VBAHZ 2006-08-07
  • 打赏
  • 举报
回复
// '这样赋值strFour中的字符串不在连续的内存块中。
// strFour = strOne & strTwo & strThree

Sure?Why?
province_ 2006-08-07
  • 打赏
  • 举报
回复
Call CopyMemory(a(0), ByVal strOne, 1)
Call CopyMemory(a(1), ByVal strTwo, 6)
Call CopyMemory(a(7), ByVal strThree, 6)
这些都是不对的!!!
UNICODE编码啊兄弟!!
如下就可以,不关API的事情。
Dim strOne As String
Dim strTwo As String
Dim strThree As String
Dim strFour As String
Dim dat() As Byte

strOne = "I"
strTwo = " love "
strThree = "csdn ."
dat = StrConv(strOne & strTwo & strThree, vbFromUnicode)
strFour = StrConv(dat, vbUnicode)
aikill 2006-08-07
  • 打赏
  • 举报
回复
呵呵,上面给的只是调试用的,仅仅是为了说明这个问题的.所以不是全局不全局的问题.
aikill 2006-08-07
  • 打赏
  • 举报
回复
Dim strOne As String * 1
Dim strTwo As String * 6
Dim strThree As String * 6
Dim strFour As String * 13
这些必须是定长吗?
如果是变长怎么办?
一笑拔剑 2006-08-07
  • 打赏
  • 举报
回复
对头设置为全局变量
junki 2006-08-07
  • 打赏
  • 举报
回复
用Type来定义。
ZOU_SEAFARER 2006-08-07
  • 打赏
  • 举报
回复
注意公共变量拉!!都是局部变量,过程一完,变量内存都被回收,还得到屁数据呀!!
迈克揉索芙特 2006-08-07
  • 打赏
  • 举报
回复
Option Explicit
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)

Public Sub xx()
Dim strOne As String * 1
Dim strTwo As String * 6
Dim strThree As String * 6
Dim strFour As String * 13
Dim a(15) As Byte


strOne = "I"
strTwo = " love "
strThree = "csdn ."
Call CopyMemory(a(0), ByVal strOne, 1)

Call CopyMemory(a(1), ByVal strTwo, 6)
Call CopyMemory(a(7), ByVal strThree, 6)
CopyMemory ByVal strFour, a(0), 13

MsgBox strFour
End Sub

Private Sub Form_Load()
xx
End Sub
aikill 2006-08-07
  • 打赏
  • 举报
回复
Option Explicit
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)

Public Sub xx()
Dim strOne As String * 1
Dim strTwo As String * 6
Dim strThree As String * 6
Dim strFour As String * 13
Dim a(15) As Byte


strOne = "I"
strTwo = " love "
strThree = "csdn ."
Call CopyMemory(a(0), VarPtr(strOne), 1)
Call CopyMemory(a(1), VarPtr(strTwo), 6)
Call CopyMemory(a(7), VarPtr(strThree), 6)
CopyMemory VarPtr(strFour), a(0), 13


End Sub

Private Sub Form_Load()
xx
End Sub

通不过,不知错在哪里。
ZOU_SEAFARER 2006-08-07
  • 打赏
  • 举报
回复
Public Sub xx()
Dim strOne As String * 1
Dim strTwo As String * 6
Dim strThree As String * 6
Dim strFour As String

strOne = "I"
strTwo = "love"
strThree = "csdn."
Call CopyMemory(a(0), VarPtr(strOne), 1)
Call CopyMemory(a(1), VarPtr(strTwo), 6)
Call CopyMemory(a(7), VarPtr(strThree), 6)


End Sub
看看这个,没有检验,不知道对错!!

1,486

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧