2010-10-20 203 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

相关问题