如何将String访问类型的数据复制到Ada.String固定字符串
Ada命令行参数拷贝到固定长度字符串实现方案
你从GNAT.Command_Line解析得到的是GNAT.Strings.String_Access类型的堆分配字符串指针,需要先完成内容拷贝再释放指针内存,具体实现如下:
完整示例代码
with GNAT.Command_Line; use GNAT.Command_Line; with GNAT.Strings; use GNAT.Strings; with Ada.Text_IO; use Ada.Text_IO; with Ada.Strings.Fixed; use Ada.Strings.Fixed; with Ada.Strings; use Ada.Strings; procedure Cmd_Parse is Config : Command_Line_Configuration; -- 接收命令行参数的访问类型变量,注意不要和固定字符串重名 File_Name_Access : String_Access; -- 你定义的固定长度字符串 File_Name : String(1 .. 256) := (others => ' '); begin Define_Switch (Config => Config, Output => File_Name_Access'Access, Long_Switch => "--file=", Switch => "-f=", Help => "File with Composition"); -- 完成命令行解析 Getopt(Config); -- 复制+释放逻辑 if File_Name_Access /= null then -- 调用Fixed包的Move过程自动处理对齐、截断、填充 Move( Source => File_Name_Access.all, Target => File_Name, Drop => Right, -- 文件名超出256字符时截断右侧多余内容 Justify => Left, -- 内容左对齐 Pad => ' ' -- 长度不足256时右侧填充空格 ); -- 拷贝完成后释放堆内存 Free(File_Name_Access); end if; -- 测试:修剪尾部空格后打印实际文件名 Put_Line("Input file: " & Trim(File_Name, Right)); end Cmd_Parse;
注意事项
- 必须避免变量名冲突:接收命令行参数的
String_Access变量不能和固定长度字符串同名,否则会触发编译错误。 - 访问空值判断:如果用户未传入
-f/--file参数,File_Name_Access会是空值,直接访问.all属性会触发运行时约束错误,必须先判空再操作。 - 超长场景自定义:如果需要对文件名超过256字符的场景做主动报错而非自动截断,可以在调用
Move前增加长度判断,自行抛出异常或输出错误提示。 - 内存释放规范:必须使用
GNAT.Strings.Free过程释放访问对象内存,不要手动调用Ada.Unchecked_Deallocation,避免类型不匹配引发的内存问题。
内容的提问来源于stack exchange,提问作者Alexander
相关产品推荐
相关产品推荐

