将子字符串保存为ada中的有界字符串

时间:2015-10-26 00:09:04

标签: string substring ada

我有以下代码:

Put_Line(Source_String (Source_String'First + Start-1..Source_String'First + Stop-2));

它可以正常工作,但我想将它用作有界字符串。

   String1: String(1..50);

如果我使用

   String1:= Source_String (Source_String'First + Start-1..Source_String'First + Stop-2)

但是这段代码并不起作用。我不能将substring用作String。编译不会输出任何错误,但也无法正常工作 附:当我只使用Put_Line时,我的程序正常工作

1 个答案:

答案 0 :(得分:2)

这里似乎存在误解:String1: String(1..50);没有声明有界字符串而是固定字符串。意识到这一点,很容易理解为什么作业通常不起作用" ... Source_String的切片长度必须正好为50个字符,否则赋值会产生约束错误。

一种解决方案是使用有界字符串,但这可能不是必需的,所以我建议采用更简单的方法。

考虑一下程序,并对其进行结构化,以便在Source_String声明之前知道StartStopString1的运行时值。您可以使用的一个工具是"声明块" - 这允许声明保持在他们的使用点本地,这是良好的编程习惯......后来,当你进行重构时,这些很好地成为抽象出程序的候选者。

现在,您可以将赋值作为初始化移动到声明中,字符串从初始化开始计算。事实上,在运行时间之前它的长度是未知的,您可以从其属性中找到长度。

你可以在声明中移动很多,如果你不打算修改内容,另一个好的做法是使声明不变。因此代码可能如下所示:

Start := ...
declare
   Source_String : constant String := Read_Line(File);
   Stop  : constant Natural := Second_Space(Source_String);
   String1 : constant String := Source_String (Source_String'First + Start-1
                                .. Source_String'First + Stop-2);
begin
   -- process String1
end; -- String1 goes out of scope here.