我有一個函數,它需要一個指向一系列字符的指針。 我希望從這一點複製256個字符,並將它們放在一個字符串中。如何將非空字符串數組轉換爲字符串?
msg不是空終止的。
下面的代碼似乎給我一些問題。 有沒有一個正確的方法來做到這一點?
Init(msg: PCHAR)
var
myStr: String;
begin
for i:= 1 to 256 do
begin
myStr[i] := msg[i-1];
end;
end;
我有一個函數,它需要一個指向一系列字符的指針。 我希望從這一點複製256個字符,並將它們放在一個字符串中。如何將非空字符串數組轉換爲字符串?
msg不是空終止的。
下面的代碼似乎給我一些問題。 有沒有一個正確的方法來做到這一點?
Init(msg: PCHAR)
var
myStr: String;
begin
for i:= 1 to 256 do
begin
myStr[i] := msg[i-1];
end;
end;
SetString(myStr, msg, 256);
如果msg
是空值終止的,因爲它應該是,和你想獲得後跟空字符的256個字符,簡單地做
myStr := msg;
如果msg
長於,你可以只是做
myStr := Copy(msg, 1, 256);
在這種情況下,更好的方法是
myStr := WideCharLenToString(msg, 256);
假設您使用的是Delphi 2009或更高版本,其中的字符串是Unicode。
msg不是空終止的。 – seveleven 2010-10-20 13:44:25
如果msg沒有被終止,沒有(標準)方式來確定msg的長度。因此也不需要複製多少個字符。在這種情況下,你必須指定如何確定味精的長度。 – 2010-10-20 13:48:44
myStr:= Copy(msg,1,256);
您的代碼錯過SetLength,修正版本是:
Init(msg: PCHAR)
var
myStr: String;
begin
SetLength(myStr, 256);
for i:= 1 to 256 do
begin
myStr[i] := msg[i-1];
end;
end;
的分配可以更有效地爲已經回答完成。
更新
SetLength分配256個字符+爲myStr的終止0;沒有SetLength你的代碼是一個錯誤:它寫入通配地址並最終導致訪問衝突。
這是爲什麼被低估?它完美的作品。 – 2010-10-20 13:57:36
+1我只是輸入相同的答案:) – 2010-10-20 14:01:53
我用這個單一函數替換了整個for循環。它完美的作品。 – seveleven 2010-10-20 14:22:16