以下是我的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;
答案 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;