如何给Char数组赋值?

3

假设我有一个变量:

Var question : array[1..50] of char;

当我执行以下操作时:
question := 't'; //What is the correct way to change the value?

它返回一个错误:

不兼容的类型:'array[1..50] of Char' 和 'Char'

注意:我想要一个最大长度为50个字符的字符串,而不是50个不同的字符。

这个问题的原因是我在另一个单元中有一条记录(这只是一个基本的例子,并不是我实际上写的),在那个单元中,我有一个记录,但我不能在其中使用字符串数据类型(如果有方法,请解释一下)。我只需要知道如何给一个字符数组赋值。


1
当你在记录中声明一个字符串时,会出现什么错误?这绝对是可能的,也比在字符数组中操作要简单得多。 - Lieven Keersmaekers
不兼容的类型:'array [1..50] of Char' 和 'Char' 是其中之一。然而,如果我将字符串中的字符数量与数组范围匹配,它就可以工作。 - Skeela87
只是一个建议,请阅读这个教程,它将帮助您了解一些Delphi构造和基础知识... http://delphi.about.com/od/beginners/a/delphicourse.htm - Nains
这是你在此处声明时遇到的错误,它不可能是你尝试在记录中使用字符串时遇到的错误。 - Lieven Keersmaekers
谢谢Nain,我会阅读它,但是我现在有点时间不够用,因为项目。不过,即使话题改变了,我之后还是会阅读它的。@Lieven,我会提供整个项目代码。 - Skeela87
4个回答

8

虽然Delphi字符串和char数组有关联,但它们并不相同。

Delphi对将字符串和字面量(char和string)赋值给char数组进行了重载,但只适用于下界为零的情况。

以下代码适用于我在D2007和Delphi XE中运行:

  var x : array[0..49] of char;
  begin
    x:='b';  // char literal
    x:='bb';  // string literal      
  end.

如果我将[0更改为[1,则会失败。这个限制可能简化了处理此类情况的语言助手,而且该功能可能只用于处理转换后的C结构,其中数组始终具有下限0。

@Skeela87,如果它对您有效,那很好,但是使用普通字符串也应该可以编译。在删除记录声明中的var后,它可以在我的Delphi 5Delphi 2010上编译。 - Lieven Keersmaekers
Lieven: 我猜他想要 blockwrite 这个记录。但是,那样的话你只能使用 shortstring,但它有一个 255 字符限制和一个前导长度字节。 - Marco van de Voort

3

您确定不能在记录中使用字符串数据类型吗?不管怎样...

type
  TCharArray = array[Char] of Char;

function StringToArray(Str: string): TCharArray;
begin
  FillChar(Result, High(Byte), #0);
  Move(Str[1], Result, length(Str));
end;

procedure TestCharArray;
var
  question: TCharArray;
begin
  question := StringToArray('123');
  ShowMessage(PChar(@question));
end;

同时请查看 StrPCopy 函数。

没事了,我知道我忘记做什么了。把它放在TForm类中。 - Skeela87
但是使用您的代码并输入StringToArray('test'),我收到了错误提示:不兼容类型:'array[0..65535] of Char' 和 'System.TArray<System.Char>'。 - Skeela87

2

如果您不需要使用 unicode 字符,您可以像这样定义字符串:string[50]

之后,您无需使用任何函数或转换就可以处理该字符串,读写文件也同样简单。

Hscores = record
var
  _topscore : integer;
  _topname : string[50];
end;  

这是处理记录中固定长度ansi字符串数据的最惯用方式。加1分,因为指出String [50]实际上是由AnsiChar(字节大小)元素组成的固定长度字符串。 - Warren P

1

我尝试使用你给的链接中的示例,但仍然出现了错误。我对Delphi还不是很熟悉,所以可能做错了什么。虽然我刚刚发现如果我使用array[1..5] of char,我必须使用一个长度为5个字符的字符串。现在我需要一种能够让我自己设置长度的方法。谢谢你的回复,但也许我应该重新表达我的问题,在主贴中进行编辑。 - Skeela87
在这种情况下,索引从1开始,因此(question [0]:= 't';)将再次导致编译时数组边界错误,question [1]:= 't'; 更好 :) - Nains
1
@Nains:天啊!我好久没用Delphi了。 - Matt Ellen

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