2010-10-20 188 views
3

我有一個函數,它需要一個指向一系列字符的指針。 我希望從這一點複製256個字符,並將它們放在一個字符串中。如何將非空字符串數組轉換爲字符串?

msg不是空終止的。

下面的代碼似乎給我一些問題。 有沒有一個正確的方法來做到這一點?

Init(msg: PCHAR) 
var 
myStr: String; 
begin 
for i:= 1 to 256 do 
begin 
    myStr[i] := msg[i-1]; 
end; 
end; 

回答

13
SetString(myStr, msg, 256); 
+0

這是爲什麼被低估?它完美的作品。 – 2010-10-20 13:57:36

+0

+1我只是輸入相同的答案:) – 2010-10-20 14:01:53

+0

我用這個單一函數替換了整個for循環。它完美的作品。 – seveleven 2010-10-20 14:22:16

2

如果msg是空值終止的,因爲它應該是,和你想獲得後跟空字符的256個字符,簡單地做

myStr := msg; 

如果msg長於,你可以只是做

myStr := Copy(msg, 1, 256); 

在這種情況下,更好的方法是

myStr := WideCharLenToString(msg, 256); 

假設您使用的是Delphi 2009或更高版本,其中的字符串是Unicode。

+0

msg不是空終止的。 – seveleven 2010-10-20 13:44:25

+1

如果msg沒有被終止,沒有(標準)方式來確定msg的長度。因此也不需要複製多少個字符。在這種情況下,你必須指定如何確定味精的長度。 – 2010-10-20 13:48:44

3

您的代碼錯過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你的代碼是一個錯誤:它寫入通配地址並最終導致訪問衝突。

+0

這些代碼完美地工作 – seveleven 2010-10-20 14:21:45

+0

爲什麼你必須SetLength?它是否爲myStr分配256字節的緩衝區? – seveleven 2010-10-20 14:23:12

+0

@seveleven:是的。想象一下你有'myStr:='test''。那麼,當然,你不能訪問'myStr [7]'。你必須設置字符串的長度 - 然後你可以設置它的字符。 – 2010-10-20 15:57:18

相關問題