我是Ada的新手。
如何检查输入是否被按下?
while循环应该能够检查输入字符是空格还是输入键。
此外,如何检查用户输入类型,例如其他语言的type()
或typeof()
功能?
FUNCTION ReadValue RETURN Unbounded_String IS
ValueChar : Character;
Result : Unbounded_String := To_Unbounded_String("NULL");
BEGIN
Get(ValueChar);
Skip_Line;
WHILE ValueChar /= ';'LOOP
Get(ValueChar);
IF IsValidNameInput(ValueChar) THEN
Result := Result & ValueChar;
ELSE
exit;
END IF;
END LOOP;
ValueIntegerFlag := CheckValue(Value);
RETURN Result;
END ReadValue;
答案 0 :(得分:1)
使用Get_Immediate
代替Get
- ARM A.10.7(9),在没有特殊ENTER处理的情况下一次一个地阅读字符。
您可以使用Ada.Characters.Handling
- ARM A.3.2对您刚读过的角色的类进行检查 - 类似
function Is_Valid_Name_Input (Ch : Character) return Boolean is
begin
return Ada.Characters.Handling.Is_Graphic (Ch)
and then not Ada.Characters.Handling.Is_Space (Ch);
end Is_Valid_Name_Input;
(可能不是你想要的,因为它使&*^$$^
成为有效的名字!)
Ada.Characters.Handling.Is_Line_Terminator
检测到ENTER(在Unix上;也可能在Windows上)。
您可以通过尝试转换并在失败时捕获异常来检查字符串是否对应于整数:
function Check_Integer_Value (Str : Unbounded_String) return Boolean is
Dummy : Integer;
begin
Dummy := Integer'Value (To_String (Str));
return True;
exception
when Constraint_Error =>
return False;
end Check_Integer_Value;
关于ReadValue
:
Result
- 它以空字符串开头(你真的不想以字符串”NULL”
开头)。Skip_Line
是什么意思?尝试类似
的内容function Read_Value return Unbounded_String is
Value_Char : Character;
Result : Unbounded_String;
begin
loop
Get_Immediate (Value_Char);
exit when Value_Char = ';';
if Is_Valid_Name_Input (Value_Char) then
Result := Result & Value_Char;
end if;
end loop;
return Result;
end Read_Value;