pascal中的长字符串

pascal中的长字符串,pascal,freepascal,Pascal,Freepascal,我希望能够使用相当长的字符串(不超过100000个符号)。 据我所知,一个典型的字符串变量最多只能包含256个字符。 有没有办法存储这么长的字符串?您可以使用。旧式(Turbo Pascal,或Delphi 1)字符串,现在称为ShortString,限制为255个字符(为字符串长度保留了字节0)。这似乎仍然是FreePascal中的默认设置(根据@MarcovandeVoort下面的评论)。但是,请继续阅读,直到您进入下面的ansisting讨论和代码示例为止。:-) 目前,我知道Pascal

我希望能够使用相当长的字符串(不超过100000个符号)。 据我所知,一个典型的字符串变量最多只能包含256个字符。 有没有办法存储这么长的字符串?

您可以使用。

旧式(Turbo Pascal,或Delphi 1)字符串,现在称为
ShortString
,限制为255个字符(为字符串长度保留了字节0)。这似乎仍然是FreePascal中的默认设置(根据@MarcovandeVoort下面的评论)。但是,请继续阅读,直到您进入下面的
ansisting
讨论和代码示例为止。:-)

目前,我知道Pascal的大多数其他方言默认为
AnsiString
(单字节字符的长字符串)或
UnicodeString
(多字节字符的长字符串)。这两个字符都不限于255个字符

当前版本的Delphi默认使用
UnicodeString
作为默认类型,因此声明
string
变量实际上是一个长
UnicodeString
。字符串长度没有实际上限:

var
  Test: string;  // Declare a new Unicode string
begin
  SetLength(Test, 100000);   // Initialize it to hold 100000 characters
  Test := StringOfChar('X', 100000);  // Fill it with 100000 'X' characters
end;
如果要强制使用单字节字符(但不限于255个字符串),请使用
AnsiString
(如果使用
{$H+}
编译器指令,可以将其设置为默认的
string
键入FreePascal,谢谢@MarcovandeVoort):

最后,如果您出于未知原因想要使用限制为255个字符的旧式
ShortString
,请使用
ShortString
或旧式
String[Size]
声明将其声明为:

var
  Test: ShortString;  // Declare a new short string of 255 characters
  ShortTest: String[100];  // Also a ShortString of 100 characters
begin
  // This line won't compile, because it's too large for Test
  Test := StringOfChar('X', 100000);  // Fill it with 100000 'X' characters
end;

当您使用免费的Pascal时,您不必担心这一点。您只需要将指令{$H+}插入源代码的开头

{$H+}

var s: String;

begin
    s := StringOfChar('X', 1000);
    writeln(s);
end.

当然,您可能需要使用
{$modeobjfpc}
{$coperators}

fpc和objfpc默认为短字符串。(但是可以通过{$H+}使用ansistring,Lazarus模板通常会这样做)。Trunk版本支持$mode delphiunicode,其中string=unicodestring,但到目前为止,只有system和sysutils的文件I/O例程进行了修改。@MarcovandeVoort:我已编辑以包含该信息。谢谢你让我知道;我已经有一段时间没有使用FPC了,我认为它们在默认情况下仍然更接近Delphi。如果启用Delphi模式((每个)源代码中的模式Delphi或cmdline上的-Sd,第一个通常隐藏在大型开源软件包的central.inc文件中)。但是默认的模式是模式fpc,这是一种经过清理的Turbo Pascal方言(没有16位比特码),带有一些Delphi的程序扩展。模式objfpc添加了类和大多数其他旧的Delphi特性,但有一些FPC特有的怪癖。
{$H+}

var s: String;

begin
    s := StringOfChar('X', 1000);
    writeln(s);
end.