10

我正在编写一个应该对字母字符进行大小写转换的 Ada 程序。该程序使用 1、2 或 3 个命令行参数。我几乎把事情写好了,但我不知道如何进行争论。命令行参数是:

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

有什么帮助吗?

4

3 回答 3

9

您可以使用标准包Ada.Command_Line来访问命令行参数。

你有Argument_Count参数的数量。您必须Argument(Number : Positive)在 position 处获取参数字符串Number

于 2013-01-24T00:46:32.283 回答
7

Ada.Command_Line 包是标准的,完全适合您的任务。

使用 Ada.Command_Line 进行更复杂的命令行解析变得很困难。如果您的命令行需要命名而不是位置关联,请参阅Adacore 的Gem 中关于将 Gnat.Command_Line 用于(不太便携,如果这很重要,但是)更多类似 Unix 的参数和选项命令行序列。

还有一个我在一个小项目中成功使用的通用命令行解析器。

于 2013-01-24T12:06:16.383 回答
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;
于 2013-01-24T16:12:18.127 回答