Ada中的字符串和字符处理

时间:2014-10-30 19:35:48

标签: ada gnat

以下是我的Ada代码,

我想要达到的目标是, 1)从用户那里获取输入 2)如果用户输入的值如1; 2; 3则有效并继续下一次输入另外输入它是打印BAD并退出

以下代码的问题是,当我输入1; 2; 3时,它只打印“1”而不是2和3。

我哪里错了?

with
Ada.Command_Line,
Ada.Text_IO,
Ada.Integer_Text_IO,
Ada.Characters.Latin_1;
use Ada;
with Ada.Characters.Handling;  use Ada.Characters.Handling;


procedure final is
NL : Character renames Ada.Characters.Latin_1.LF;
ESC: Character renames Ada.Characters.Latin_1.Esc;
len : Natural := 0;
Input : Character := Ada.Characters.Latin_1.Esc;
Index : Natural:=0;
user_str : String(1..50) := (others => Character'Val(0));
user_ip : Integer := 1;

function checkUserStr(S : String) return Boolean is
Test : Integer := 1;
Count : Integer := 1;
begin
    for i in S'Range loop
        if S(i) = Character'Val(0) and Count = 1 then
            return false;
        end if;

        if Count = 1 or Count = 3 or Count = 5 then
            if true = Is_Alphanumeric(S(i)) then                                                                                                        
                Ada.Text_IO.Put(S(i));

                if Count = 5 and S(i) = ' ' then
                    user_ip := 0;
                end if;
            else 
                return false;
            end if;
        elsif Count = 2 or Count = 4 then
            if S(i) = ';' then
                exit;
            else
                return false;
            end if;
        elsif Count = 6 then
            if S(i) /= Character'Val(0) then
                return false;
            else 
                return true;
            end if;
        end if;

        Count := Count+1;

        end loop;

        return true;
end checkUserStr;

begin

While user_ip /= 0 loop
        Ada.Text_IO.Get_Line (user_str,len);
        if true = checkUserStr(user_str) then
            user_str := (others => Character'Val(0));
        else
            Ada.Text_IO.New_Line;
            Ada.Text_IO.Put("BAD");
            exit;
        end if;
end loop;

end final;

1 个答案:

答案 0 :(得分:0)

“Like”不是一个非常好的协议规范,但这是一个可能的解决方案:

with Ada.Text_IO;

procedure CSV_Digits is
   type Data is range 1 .. 3;
   package Data_Text_IO is new Ada.Text_IO.Integer_IO (Data);

   subtype Separators is Character range ';' .. ';';

   procedure Not_EOL is
   begin
      if Ada.Text_IO.End_Of_Line then
         raise Ada.Text_IO.Data_Error;
      end if;
   end Not_EOL;

   procedure EOL is
   begin
      if not Ada.Text_IO.End_Of_Line then
         raise Ada.Text_IO.Data_Error;
      end if;
   end EOL;

   Digit     : Data;
   Separator : Separators;
begin
   loop
      Data_Text_IO.Get (Digit);    Not_EOL;
      Ada.Text_IO.Get (Separator); Not_EOL;
      Data_Text_IO.Get (Digit);    Not_EOL;
      Ada.Text_IO.Get (Separator); Not_EOL;
      Data_Text_IO.Get (Digit);        EOL;
      Ada.Text_IO.Skip_Line;
   end loop;
exception
   when Ada.Text_IO.Data_Error =>
      Ada.Text_IO.Put_Line ("BAD");
end CSV_Digits;