Ada:字符串合法价值?

时间:2016-12-14 09:59:47

标签: ada

在Ada中,我们可以给出一个字符串少于最初指定的字符吗? 例如:

Text : String(1..5);
Text := "ada";

这段代码是否正确?或者我们是否有义务给出一个5个字符的字符串?

谢谢。

3 个答案:

答案 0 :(得分:7)

使用类型String,您必须 - 与Ada中的其他数组类型一样 - 填充数组中的所有位置。

但是有很多技巧:

  • 初始化您声明它的String(数组),并且您不必明确声明范围:
declare
   Text : constant String := "Ada";
begin
   ...
end;
  • 选择要放入内容的String(数组)的哪个切片:
declare
   subtype Five_Characters is String (1 .. 5);
   Text : Five_Characters := (others => ' ');
begin
   Text (2 .. 4) := "Ada";
   ...
end;

使用Ada.Strings.Unbounded

declare
   use Ada.Strings.Unbounded;
   Text : Unbounded_String;
begin
   Text := To_Unbounded_String ("Ada");
   ...
end;

答案 1 :(得分:1)

代码不正确,您必须指定5个字符,例如

declare
    Text : String(1..5);
begin
    Text := "ada  ";
end;

或指定范围

declare
    Text : String(1..5) := (others => ' '); -- Init to spaces
begin
    Text(1..3) := "ada";                    -- Text now contains "ada  "
end;

或使用其中一个可用的字符串处理包。

答案 2 :(得分:0)

是的,Ada可以做到。

您可以将较小长度的字符串分配给给定长度的固定字符串。 在“ Ada.Strings.Fixed”包下定义了一个“移动”过程。

借助此移动过程,您可以将较小的字符串分配给给定的固定字符串,用空格填充其余索引,并对齐复制的字符串Left,Center或Right。

with Ada.Text_IO; use ADA.Text_IO;
with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;
with Ada.Command_Line;
with Ada.Strings;
with Ada.Strings.Fixed;
with Ada.Strings.Bounded;
with Ada.Strings.Unbounded;

procedure fixed_string_ops is

    str_1 : String(1 .. 5);


begin


    Ada.Strings.Fixed.Move (Source => "Ada", Target => str_1, Drop => Ada.Strings.Right, Justify => Ada.Strings.Right, Pad => Ada.Strings.Space);
    Put_Line(str_1);

    Ada.Strings.Fixed.Move (Source => "Ada", Target => str_1, Drop => Ada.Strings.Right, Justify => Ada.Strings.Center, Pad => Ada.Strings.Space);
    Put_Line(str_1);

    Ada.Strings.Fixed.Move (Source => "Ada", Target => str_1, Drop => Ada.Strings.Right, Justify => Ada.Strings.Left,Pad => Ada.Strings.Space);
    Put_Line(str_1);


end fixed_string_ops;

使用以下代码编译以上代码

> gnatmake fixed_string_ops.adb

然后运行

> fixed_string_ops.exe
  Ada
 Ada
Ada

您可以看到填充和对齐方式。