【问题标题】:how can delphi 'string' literals be more than 255?delphi'string'文字怎么能超过255?
【发布时间】:2012-01-07 06:33:00
【问题描述】:

我正在研究 delphi 7,我正在研究字符串,我遇到了这个

对于默认长度的字符串,即简单声明为字符串,最大大小始终为 255。ShortString 绝不允许超过 255 个字符。

delphi strings

曾经我不得不在我的 delphi 代码中做这样的事情(那是一个非常大的查询)

  var
    sMyStringOF256characters : string;
    ilength : integer;
    begin
       sMyStringOF256characters:='ThisStringisofLength256,ThisStringisofLength256,.....'
       //length of sMyStringOF256characters is 256
    end;

我得到了这个错误

[错误] u_home.pas(38):字符串文字最多可以有 255 个元素。

但是当我尝试这个时

    var
      iCounter              : integer;
      myExtremlyLongString  : string;
   begin
      myExtremlyLongString:='';
      Label1.Caption:='';
      for iCounter:=0 to 2500 do
         begin
            myExtremlyLongString:=myExtremlyLongString+inttostr(iCounter);
            Label1.Caption:=myExtremlyLongString;
         end;
         Label2.Caption:=inttostr(length(myExtremlyLongString));
   end; 

结果是

如您所见,myExtremlyLongString 的长度为 8894 个字符。

为什么 delphi 没有给出任何错误提示 myExtremlyLongString 的长度超过 255?

编辑 我用过

SetLength(sMyStringOF256characters,300);

但它不起作用。

【问题讨论】:

  • 也许您只是在阅读错误的文档。顺便说一句,它真的不清楚你所说的“动态分配”是什么意思,而不是......什么?
  • @user539484 : 在循环运行期间的含义可能是 strVal:=mystring,就像您分配给字符串变量的循环值
  • 啊,那么“动态地”从头开始,它是关于赋值与声明。您在上面引用的是关于声明,更具体地说 - 关于字符 literals 的编译器限制。它仅通过历史手段连接到 Turbo Pascal 弦。
  • 我猜他们并没有消除这个限制,只是因为没有实际理由让字符串 literal 超过 70 个字符......在内部(对于编译器)这样的文字是等价的到array [0..N] of Char。希望现在更清楚。

标签: string delphi size delphi-7


【解决方案1】:

为什么delphi没有给出任何错误说长度超过255 我的极长字符串?

长字符串 (AnsiString) 部分的文本中您的答案略低。

在当前版本的 Delphi 中,字符串类型只是一个别名 AnsiString,

所以字符串不限于 255 个字符,而是字符串文字。这意味着您可以构建一个长度超过 255 个字符的字符串,但代码中的字符串值不能超过 255 个字符。如果需要,您需要拆分它们。

sMyString:='ThisStringisofLength255'+'ThisStringisofLength255';

【讨论】:

  • 您好,从 2019 年开始,很抱歉告诉您这仍然是实际的 :-( 但感谢您的回答!
【解决方案2】:

拆分成:

sMyStringOF256characters := 
  'ThisStringis' +
  'ofLength256' +
  'And ManyManyManyManyManyManyManyManyManyManyManyManyMany' + 
  'ManyManyManyManyManyManyManyManyManyManyManyManyMany' + 
  'ManyManyManyManyManyManyManyManyManyManyManyManyMany' + 
  'ManyManyManyManyManyManyManyManyManyManyManyManyMany' + 
  'ManyManyManyManyManyManyManyManyManyManyManyManyMany' + 
  'ManyManyManyManyManyManyManyManyManyManyManyManyMany' + 
  'ManyManyManyManyManyManyManyManyManyManyManyManyMany' + 
  'ManyManyManyManyManyManyManyManyManyManyManyManyMany' + 
  'CharactersCharactersCharactersCharactersCharactersCharactersCharactersCharacters';

【讨论】:

  • +1,我尝试过类似的(肯定小于 255),查询一次,那次我想,限制是 255,所以没有超过 255.. 很好的例子 thanx
【解决方案3】:

在旧的 DOS/Turbo Pascal 时代,“字符串”确实被限制为 255 个字符。很大程度上是因为第一个字节包含字符串长度,而一个字节只能有0到255之间的值。

这在现代版本的 Delphi 中不再是问题。

“ShortString”是旧的 DOS/Pascal 字符串类型。

“LongString”长期以来一直是默认的字符串类型(包括我目前用于大多数生产工作的 Borland Delphi 2006)。 LongStrings(又名“AnsiStrings”)包含 8 位字符,并且仅受可用内存限制。

最新版本的 Delphi(Delphi 2009 及更高版本,包括新的 Delphi XE2)现在都默认为多字节 Unicode“WideString”字符串。 WideStrings 和 AnsiStrings 一样,实际上也是“无限”的最大长度。

这篇文章有更详细的解释:

http://delphi.about.com/od/beginners/l/aa071800a.htm

【讨论】:

  • 这在现代版本的 Delphi 中不再是问题,除了两个地方;字符串文字,以及像 string[50] 这样的下标字符串,其中(显然!)限制为 250 或更少,在我提到的情况下,限制为 50。
  • @Warren P - 你是绝对正确的。字符串文字的解决方法是使用其他线程中讨论的“'mystring' +”语法。
  • 这是不正确的信息;大多数 Delphi 字符串类型的大小限制为 2GB。 :-( docwiki.embarcadero.com/RADStudio/XE3/en/String_Types
【解决方案4】:

不同之处在于,在您的第一个代码示例中,您将字符串作为代码的一部分 - 文字字符串。这对允许的字符数有限制。

在您的第二个代码示例中,您动态生成它,而不是将其作为一个大字符串。

Delphi 中的字符串类型(与只能达到 255 的短字符串不同)可以与您的内存一样大。

【讨论】:

【解决方案5】:

您可以尝试使用 StringBuilder 类:

procedure TestStringBuilder;
var
    I: Integer;
    StringBuilder: TStringBuilder;
begin
    StringBuilder := TStringBuilder.Create;
    try
        for I := 1 to 10 do
        begin
            StringBuilder.Append('a string ');
            StringBuilder.Append(66); //add an integer
            StringBuilder.Append(sLineBreak); //add new line
        end;

        OutputWriteLine('Final string builder length: ' + IntToStr(StringBuilder.Length));
    finally
        StringBuilder.Free;
    end;
end;

【讨论】:

    【解决方案6】:

    如果您在 Delphi 中需要非常长的字符串,您可以从其他资源(如 txt 文件或任何扩展名的纯文本)加载它。我正在使用它并且它有效。您可以使用纯文本行号创建“类似”数组表。在 delphi 代码中,您可以像 @arjen van der Spek 和其他人所说的那样做。

    对我来说,文本格式为 var 的文件 -

    sometext:string=
    'txt...'+
    'txt...'+
    'txt...';

    不利于以后的编辑。

    优点:您可以使用任何长文本。

    缺点:文本代码是开放的,任何人都可以在记事本等中打开文件阅读它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-16
      • 2011-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-15
      相关资源
      最近更新 更多