Ada的命令行参数

10

我正在编写一个Ada程序,旨在对字母进行大小写转换。该程序使用1、2或3个命令行参数。我已经将程序的主体写出来了,但是我不知道如何处理命令行参数。命令行参数应包括:

  1. 单个字符,指定要应用于输入的大写或小写转换。 'U'或'u'表示大写转换;'L'或'l'指定小写转换。该参数是程序运行所必需的。
  2. (可选)用于输入大写/小写转换的文件的名称。如果未指定此参数,则程序必须从标准输入读取。
  3. (可选,仅在还提供第三个命令行参数时使用)用于加密或解密过程的输出文件的名称。如果未指定此参数,则程序必须写入标准输出。

有没有帮助?


2
写一个ADA程序,加一分。 - Ondrej Tucny
2
最好拼写为“Ada”,就像一个女人的名字。 - trashgod
3个回答

9
您可以使用标准包Ada.Command_Line来访问命令行参数。
您可以使用Argument_Count获取参数数量。 您可以使用Argument(Number : Positive)获取位置为Number的参数字符串。

7
Ada.Command_Line包是标准的,非常适合您的任务。
使用Ada.Command_Line进行更复杂的命令行解析会变得很麻烦。如果您需要命名而不是位置关联的命令行,请参见Adacore的Gem,了解如何使用Gnat.Command_Line进行更类似Unix的参数和选项序列(如果这很重要,则更少可移植)。
还有一个通用命令行解析器,我在一个小项目中成功使用过。

1
使用GNAT时,使用GNAT.Command_Line中的高级API要容易得多。来源:http://www.adacore.com/adaanswers/gems/gem-138-gnatcollcommand-line/ - flotto

3
我建议使用Ada.Command_Line,就像已经说过的那样:
with
    Ada.Text_IO,
    Ada.Command_Line,
            Ada.Strings.Bounded;

use 
    Ada.Text_IO,
        Ada.Command_Line;

procedure Main is

     package SB is new Ada.Strings.Bounded.Generic_Bounded_Length (Max => 100);
     use SB;

     Cur_Argument : SB.Bounded_String;
     Input_File_Path : SB.Bounded_String;
     Output_File_Path : SB.Bounded_String;
     I : Integer := 1;

begin

     -- For all the given arguments
     while I < Argument_Count loop
          Cur_Argument := SB.To_Bounded_String(Argument(I));      

          if Cur_Argument = "U" or Cur_Argument = "u"
          then
             -- stuff for uppercase         
          elsif Cur_Argument = "L" or Cur_Argument = "l"    
          then
             -- stuff for lowercase         
          elsif Cur_Argument = "i"
          then
             -- following one is the path of the file
             Input_File_Path := SB.To_Bounded_String(Argument(I+1));      
             i := i + 1;
          elsif Cur_Argument = "o"
          then
             Output_File_Path := SB.To_Bounded_String(Argument(I+1));
             i := i + 1;
          else
             Put_Line("Wrong arguments");
          end if;   

          i := i + 1;      
     end loop;     

end Main;

这个程序不符合规范:你发明了'i'和'o',第一个参数是强制性的,必须是l|L|u|U。如果用户在'i'或'o'后面省略文件名会发生什么? - Simon Wright
确实,但我没有找到像 optArg 这样的东西。我认为完全检查文件路径(如果路径缺失则失败)是一个不同的话题。 - clx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接