我有一个函数,它需要一个指向一系列字符的指针。 我希望从这一点复制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