我有一个函数返回特定项的字符串,我需要多次调用该函数并将这些字符串合并为一个.组合的字符串是有界的.当空格字符初始化时,我确保填充它,但我不断收到"长度检查失败"错误.有什么基本的我在这里做错了吗?
FOR I IN 1..Collection.Size LOOP
Combined_String := combined_string & Tostring(Collection.Book(I));
END LOOP;
Run Code Online (Sandbox Code Playgroud)
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 可能是您应该使用的。