访问Ada中字符串的第一个元素

时间:2010-12-21 21:31:37

标签: arrays string ada

我有一个传递给函数的字符串,我想比较字符串的第一个字符和数字。

I.E. 
if String(1) = "3"  then

当我编译时,我得到:

warning: index for String may assume lower bound of 1
warning: suggested replacement String'First + 1

我真的很想做到这一点,但是当我尝试“先”时,它实际上抓住了一个数字,而不是角色。

有更好的方法吗?

我尝试查找'第一个概念,以下网站解释说我实际上得到的是索引号,而不是实际内容:http://en.wikibooks.org/wiki/Ada_Programming/Types/array

例如,

Hello_World  : constant String := "Hello World!";
World        : constant String := Hello_World (7 .. 11);
Empty_String : constant String := "";

使用'首先我会得到:

Array    'First 'Last 'Length 'Range
Hello_World   1       12       12     1 .. 12
World         7       11        5     7 .. 11
Empty_String  1        0        0     1 .. 0

根据这些信息,我无法从Hello世界获得H(如果Hello_World(1)=“H”则进行比较)

编辑: 所以我最初这样做的方式是 (在这种情况下插入一些变量名而不是字符串)

String(String'First .. String'First) = "1"

然而,根据我所知道的,而不是写下所有这些,我发现了

String(String'First) = '1'

同样的事情,但使用字符比较,这更有意义!

感谢大家的所有答案!

3 个答案:

答案 0 :(得分:3)

字符串是新手Ada编码员的最大障碍;对于那些已经专业处理Cish语言字符串的人来说尤其如此。

Ada字符串(实际上所有Ada数组)不像C一样基于0,或者像Fortran一样基于1。然而,他们是基于编码器的感觉。如果有人想要将他们的字符串从10 ... 200索引,他们就可以。因此,访问Ada字符串中的字符最安全的方法是使用'first属性(或者更好,使用'range'first .. 'last循环遍历它们。)

在您的情况下,您似乎只想获得字符串中的第一个字符。对名为X的字符串执行此操作的最简单,最安全的方法是X(X'first)

在实践中,你几乎不会这样做。相反,你会循环遍历字符串的'first...'last寻找某些东西,或只是使用Ada.Strings.Fixed中的一个例程。

答案 1 :(得分:2)

警告建议您使用:

String(String'First + Index)

而不仅仅是

String(Index)

答案 2 :(得分:1)

你的问题中的代码有些奇怪。首先,你要调用你的变量“String”,它的类型是“String”。阿达将不会吵醒。

您为该代码片段重现的警告语句没有意义。

假设您的变量实际上称为“值”,即:

Value : String := "34543";

Value(1)与Value(Value'First + 1)不同,因为Value'First(在此声明中)为1 。所以你最终引用了Value(1 + 1)。您似乎遇到了这种情况,因为提到您无法在“Hello World”字符串中引用“H”。

现在警告是有效的,因为你使用'First(以及'Last和'Range)来引用数组边界更安全。但是如果要从通过'检索的边界偏移',则需要使用正确的索引。首先,通常使用0或基于1(在这种情况下,您需要偏移1)。使用在您的上下文中更合适和可读的基础。