首页 文章

Ada 95检查输入是否被按下

提问于
浏览
1

我是阿达的新手 .

如何检查输入是否被按下?

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;

1 回答

  • 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;
    

相关问题