String Delphi中字符串与字符的组合

String Delphi中字符串与字符的组合,string,delphi,char,String,Delphi,Char,因此,当我运行这个函数并使用ShowMessage获取I的每个增量中的t值时,t始终为空。谁能告诉我这个问题吗?这是使用Delphi XE6编译的问题是字符串使用基于1的索引,您访问的是越界的。您的循环应该是: function leftstr(s:string; n:Integer):string; var i:integer; t:string; begin //init var t t := ''; for i := 0 to n do begin //main loop t := t +

因此,当我运行这个函数并使用ShowMessage获取I的每个增量中的t值时,t始终为空。谁能告诉我这个问题吗?这是使用Delphi XE6编译的

问题是字符串使用基于1的索引,您访问的是越界的。您的循环应该是:

function leftstr(s:string; n:Integer):string;
var
i:integer;
t:string;
begin
//init var t
t := '';
for i := 0 to n do
begin
//main loop
t := t + s[i];
end;
//return results
Result:=t;
end;
可能发生的情况是,
s[0]
引用了字符串元数据的某个部分(长度或引用计数,我记不起来是哪个)恰好包含零字节。当字符串被传递到
ShowMessage
时,这将被解释为空终止符

如果您在编译器选项中启用了范围检查功能,编译器将插入可以为您找到错误的代码。这个范围检查功能是一个令人惊讶地被忽略和忽略的功能



当然,这个函数有点毫无意义,而且效率相当低。您可以从
StrUtils
单元使用。或者从
系统
装置中取出普通旧的。

是使用副本。如果s为空,则s[i]将返回一个访问冲突。在Delphi和前面的Pascal中,字符串数据类型具有保留元素0。它过去是Pascal数组的长度,对于短字符串(长度小于255)也可能是。字符串结构的详细信息可在Delphi帮助中找到。@桌面Delphi中的EchelonKnight(即非移动零基字符串),则
s[0]
是一个超出范围的错误。请记住,我们讨论的是
string
,而不是完全不同类型的短字符串。
字符串中绝对没有保留元素0
。您这样想是大错特错的。Delphi文档显示元素0和更“左”的元素,即负数,包含与大小和分配或字符串相关的元数据。就编译器而言,所有这些都超出了范围,但仍为字符串保留了空间。@EchelonKnight用于非空字符串,这可能在今天是正确的,但它是实现细节,可能会发生更改,空字符串不存在,并且您不能期望使用
[]
访问该元数据。你为什么要这么做?
for i := 1 to n do