如何在Ada中从其他字符串构建字符串?

mat*_*eek 7 string ada

我想在日志文件中输出标题行,然后在数据前输出一行" - ".为此,我创建了一个标题字符串,然后输出相同数量的' - '.

但是下面的代码总是因CONSTRAINT_ERROR而失败,因为生成的字符串不是1024个字符.在Ada中,字符串分配需要完全相同的长度而不仅仅是足够的容量.

选项1)是计算确切的长度,但对未来的变化是脆弱的.选项2)是使用String以外的东西.

procedure F() is 
    Msg : String(1..1024);
begin
    Open_Log();
    Msg :=       FLS(" Field1", 12) &
           "|" & FLS(" Field2", 12) &
           "|" & FLS(" Field3", 16);

    Log_To_File("# " & Msg);
    Log_To_File("# " & Fill_String(Msg'Last, '-'));
end;
Run Code Online (Sandbox Code Playgroud)

T.E*_*.D. 6

许多习惯于在C语言中逐步构建字符串的人很难将他们的思想包裹在Ada字符串周围,你应该按原样初始化和使用它们.当您了解关于Ada字符串的这一事实时,解决方案变得更加简单.我甚至可以抛弃你的"填充"程序.

procedure F() is  
   Msg : constant String
      := FLS(" Field1", 12) & 
       "|" & FLS(" Field2", 12) & 
       "|" & FLS(" Field3", 16); 
   Separator : constant String := (1..Msg'length => '-'); --'
begin 
   Open_Log(); 

   Log_To_File("# " & Msg); 
   Log_To_File("# " & Separator); 
end;
Run Code Online (Sandbox Code Playgroud)

(注意:评论是让SO的着色器回到正轨的黑客)

如果您不必使分隔符具有相同的长度,则甚至不需要声明变量.

如果是我,我会做一些事情,如Log_To_File跟踪长度,并根据要求生成自己适当大小的分隔符.然后你可以写:

Open_Log();
Log_To_File ("# " & FLS(" Field1", 12) & 
       "|" & FLS(" Field2", 12) & 
       "|" & FLS(" Field3", 16)); 
Log_Separator_To_File;
Run Code Online (Sandbox Code Playgroud)