如何将一个非空结尾字符数组转换为字符串?

3

我有一个函数,它接收一个指向一系列字符的指针。我希望从该点复制256个字符,并将它们放入一个字符串中。

msg没有以null结尾。

下面的代码似乎给我带来了一些问题。有没有正确的方法来做到这一点?

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

13
SetString(myStr, msg, 256);

我用这个单一函数替换了整个for循环。现在它完美地工作了。 - seveleven
为什么我们不需要为myStr分配缓冲区?是因为SetString会为您完成吗? - seveleven
是的:http://docwiki.embarcadero.com/VCL/zh/System.SetString(在这种情况下,长字符串部分是相关的)。 - Ondrej Kelle
长度似乎是一个不好的参数名称,因为它不清楚是以字节还是字符的长度(顺便说一下,它是字符长度)。 - Remko

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为myStr分配了256个字符和一个终止的0;如果没有使用SetLength,你的代码会出错:它写入了未知的地址,最终会导致访问冲突。


为什么你必须使用SetLength?它是否为myStr分配了256字节的缓冲区? - seveleven
@seveleven:是的。想象一下你有myStr := 'test'。然后,当然,你不能访问myStr[7]。你必须设置字符串的长度-然后你才能设置它的字符。 - Andreas Rejbrand

2
如果 msg 是以空字符结尾的(应该是这样),并且你想要获取的256个字符后面跟着空字符,那么只需执行以下操作:
myStr := msg;

如果msg太长,你可以这样做:
myStr := Copy(msg, 1, 256);

在这种情况下,更好的方法是:
myStr := WideCharLenToString(msg, 256);

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

1
如果msg没有以null结尾,就没有(标准的)方法确定msg的长度。因此也无法确定要复制多少个字符。在这种情况下,您必须指定如何确定msg的长度。 - Marco van de Voort

-1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接