2014-11-02 34 views
0

我有下面的代码检查,如果输入的字符串是字母或不阿达:阿达字母数字字符串索引检查失败,运行时错误

function Check_AplhaNumeric(input_String:in String) return Boolean is 

    begin 

     Alphanumeric_or_not:=TRUE; 
     for Index_Character in 1..Length(To_Unbounded_String(input_String)) loop 
        Alphanumeric_or_not:=Is_Alphanumeric(Character'Val(Character'Pos(input_String(Index_Character)))); 
     exit when Alphanumeric_or_not = False; 
     end loop; 
     return True; 

end Check_AplhaNumeric; 

下面的代码调用上面的函数三次

Is_it:=Check_AplhaNumeric(stringInput(1..First_Semicolon-1)); 

Is_it:=Check_AplhaNumeric(stringInput(First_Semicolon+1..Second_Semicolon-1)); 

Is_it:=Check_AplhaNumeric(stringInput(Second_Semicolon+1..stringInput'Last)); 

我有一个输入字符串,例如:a;value;b,它根据输入中的分号分为三部分。 第一次调用Check_AlphaNumeric作品就好了,并检测是否该字符串是字母数字与否, 然而,其中包括第二和第三部分从字符串调用生成以下错误:

raised CONSTRAINT_ERROR : alpha.adb:247 index check failed 

我不不知道什么似乎是错误的,因为当我在字符串中的第一个分号之前首次调用它时,它工作得很好。

即使其中一个字符不是字母数字,我也需要它打印一些消息并退出程序。

+1

您正在调用'To_Unbounded_String',以便您可以将结果传递给'Length'函数。只需使用'input_String'Length'。 'Character'Val(Character.Pos(...))'是无用的;他们是逆向操作。你的函数总是返回'True'。你假设字符串的下限为1;使用“Range”而不是'1 ..'Length'。 – 2014-11-02 21:43:20

回答

6

函数的主体继承了stringInput的范围,这意味着你正在遍历一个无效的范围。

假设stringInput包含字符串“1337; H4X0R;富”

第一次调用Check_Alphanumericinput_String范围为1..4。 你通过1..4循环,这很好。 第二次,范围是6..10,但现在你循环的范围1..5,这显然不是你想要的。

,而不是尝试循环输入数组的范围:

for Index_Character in input_String'Range loop 

并没有转换为unbounded_string只是为了得到一个字符串/数组的长度,使用'Length属性来代替。请记住,所有数组都有'First,'Last,'Length'Range