10

アルファベット文字の大文字小文字変換を行うことになっているAdaプログラムを書いています。プログラムは、1、2、または3つのコマンドライン引数を使用します。私はほとんど物事を書いていますが、議論をどのように行うかについての手がかりはありません。コマンドライン引数は次のとおりです。

  1. 大文字変換と小文字変換のどちらを入力に適用するかを指定する1文字。「U」または「u」は大文字の変換を意味します。「L」または「l」は小文字変換を指定します。このパラメーターは、プログラムを実行するために必要です。
  2. (オプション)大文字/小文字変換への入力に使用されるファイルの名前。このパラメーターが指定されていない場合、プログラムは標準入力から読み取る必要があります。
  3. (オプションで、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を使用すると大変な作業になります。コマンドラインに位置の関連付けではなく名前を付ける必要がある場合は、 Gnat.Command_Lineを使用して(重要な場合は移植性が低くなりますが)、パラメーターとオプションのUnixライクなコマンドラインシーケンスについて、 AdacoreのこのGemを参照してください。

小さなプロジェクトでうまく使用した汎用コマンドラインパーサーもあります。

于 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 に答える