Ada String Concatenation

n0d*_*arb 3 ada

我有一个函数返回特定项的字符串,我需要多次调用该函数并将这些字符串合并为一个.组合的字符串是有界的.当空格字符初始化时,我确保填充它,但我不断收到"长度检查失败"错误.有什么基本的我在这里做错了吗?

FOR I IN 1..Collection.Size LOOP  
    Combined_String :=  combined_string & Tostring(Collection.Book(I));  
END LOOP;
Run Code Online (Sandbox Code Playgroud)

Mar*_*c C 5

Unbounded_String可能是最简单的方法:

with Ada.Strings.Unbounded;
use Ada.Strings.unbounded;

   ...

Temp_Unbounded_String : Unbounded_String;  -- Is empty by default.

   ...

for I in 1 .. Collection.Size loop
   Append(Temp_Unbounded_String, ToString(Collection.Book(I));
end loop;
Run Code Online (Sandbox Code Playgroud)

如果您需要将结果放在固定长度的标准字符串中:

declare
   Temp_String : constant String := To_String(Temp_Unbounded_String);
begin
   -- Beware! If the length of the Temp_String is greater than that of the
   -- fixed-length string, a Constraint_Error will be raised.  Some verification
   -- of source and target string lengths must be performed!
   Combined_String(Temp_String'Range) := Temp_String;
end;
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用Ada.Strings.Fixed Move()过程将Unbounded_String引入目标固定长度字符串:

Ada.Strings.Fixed.Move(To_String(Temp_Unbounded_String), Combined_String);
Run Code Online (Sandbox Code Playgroud)

在这种情况下,如果源字符串"太长",则默认会引发Length_Error异常.Move()还有其他参数可以修改该情况下的行为,有关详细信息,请参阅Move上提供的链接.


小智 3

为了分配Combined_String,您必须立即分配完整的正确长度。您无法“构建”字符串并在 Ada 中以这种方式分配它。

在没有看到其余代码的情况下,我认为 Ada.Strings.Unbounded 可能是您应该使用的。