ヌル終端文字列を短い文字列に変換する方法

解決


かわにー  2002-07-24 11:07:26  No: 1164

早速ですが、ヌル終端文字列を短い文字列に変換する方法を知りたいのですが
ヘルプで調べると下記のサンプルがあって

var
  A: array[0..79] of Char;
  S: String;
begin
  S := 'Honk if you know Blaise.';
  StrPCopy(A, S);
  Canvas.TextOut(10, 10, string(A));
end;

string(A)とすればよさそうなのですが、Aの中にデータとして#0が入るケースでは思った結果が出ないのです。仮にAの中が全て#0の場合は、

s:=string(A)

でsは80バイトの#0の文字列になってほしいのです。
どのようにすればよいのでしょうか、よろしくお願いします。


にしの  2002-07-24 19:23:51  No: 1165

ヘルプを読んだのなら、短い文字列が\0を終端とした文字列ということは理解していますよね。
もし、後ろを\0で埋めたいのであれば、SetLengthして後ろの領域ごとMemoryCopyです。


かわにー  2002-07-24 21:34:19  No: 1166

にしのさん、お世話になります。

短い文字列というのは

06  P  a  s  c  a  l  (ここから空きゴミデータ)

と先頭に文字列の長さが入っているタイプではないのですか?
先の例では

80  #0  #0  #0  …  #0  

と変換出来るのかと思っていました。


にしの  2002-07-24 22:28:39  No: 1167

すみません、勘違いです。
80 #0 #0 #0 #0 とするには、メモリをコピーしないといけません。

> StrPCopy は,Pascal 文字列を,ヌルで終わる文字列にコピーします。
とヘルプにかかれているので、#0があればその後ろはコピーされませんから。

それと、stringだけだと、shortstringになりません。
string[80]です。


にしの  2002-07-24 22:46:46  No: 1168

こんな感じになりました。

type
  String80 = string[80];

procedure TForm1.Button1Click(Sender: TObject);
var
  a: array[0..80] of char;
  s: String80;
  ps: PChar;
begin
  a := 'abc';
  ps := addr(s); // shortstringのアドレス
  CopyMemory(addr(ps[1]), addr(a), 80); // [1]から実体
  ps[0] := chr(80); // [0]は文字数
  ShowMessage(s);
end;


かわにー  2002-07-25 10:59:08  No: 1169

にしのさんサンプルまで付けて頂きまして
ありがとうございました。
文字列長が80固定というわけでは無いので
BASIC的な変数の使い方しか理解して
いない私は苦戦しましたが、お陰さまで
なんとか形になりました。
今回も大変お世話になりました。m(_ _)m


※返信する前に利用規約をご確認ください。








  このエントリーをはてなブックマークに追加