NULLを含む文字列

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
返信する
メッセージ
作成者
超初心者

NULLを含む文字列

#1 投稿記事 by 超初心者 »

Dim ab As String
ab = Chr$(&H31)+ Chr$(0)+Chr$(&H32)+ Chr$(0)

上記と同じ事を、Byte配列で行いたいのですが、

Dim ab[3] As Byte
lstrcpy(ab As BytePtr,Chr$(&H31)+ Chr$(0)+Chr$(&H32)+ Chr$(0))

としても、NULLが入りません。
どうすれば良いのでしょう?
NoWest
記事: 264
登録日時: 2005年5月31日(火) 10:52
お住まい: 高知
連絡する:

Re: NULLを含む文字列

#2 投稿記事 by NoWest »

> Dim ab As String
> ab = Chr$(&H31)+ Chr$(0)+Chr$(&H32)+ Chr$(0)
>
> 上記と同じ事を、Byte配列で行いたいのですが、
>
> Dim ab[3] As Byte
> lstrcpy(ab As BytePtr,Chr$(&H31)+ Chr$(0)+Chr$(&H32)+ Chr$(0))
>
> としても、NULLが入りません。
> どうすれば良いのでしょう?

さてさて、どうしてlstrcpyを使用したときにうまくいかないと思いますか?

この問いの答えは簡単で、lstrcpy関数はコピーしようとする文字列にNULL文字が含まれている場合、その場でコピーを止めてしまうんですね。

これをどうやって回避するかといいますとコピーしようとする文字の長さを予め指定してコピーしてやればよいということになります。

とはいっても、lstrcpy関数には文字の長さを指定することが出来ませんのでメモリ関連の操作にしようするmemcpy関数を変わりに使ってやります。

コード: 全て選択

Dim ab[3] As Byte
Dim str As String
str=Chr$(&H31)+Chr$(0)+Chr$(&H32)+Chr$(0)
memcpy(ab As BytePtr,StrPtr(str),4)
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

#3 投稿記事 by イグトランス »

もっと短くmemcpy(ab, Ex"1\02\0", 4)やmemcpy(ab, Ex"1\02", 4)とも書けます。
Ex付きの文字列では\0がChr$(0)相当に扱われます。

さらに,これ以降abの中身を書き換えることが無ければ,abをBytePtr型にして,こうにも書けます。

コード: 全て選択

Dim ab As BytePtr
ab = Ex"1\02"
返信する