如何在Delphi中为if语句指定多个范围?

时间:2017-10-06 19:14:30

标签: delphi

    for counter := 1 to lengthofpassword do
  begin
    currentletter:=password[counter];
    currentascii:=Ord(currentletter);
    if (96<currentascii<123) OR (64<currentascii<91) OR (47<currentascii<58) then
    Writeln('valid')
    else
    asciicheck:=false;
  end;

我知道这段代码错了,但我这样做是为了解释我想问的问题。如何为if语句指定范围?之前,我搞砸了很多if语句,而且我的代码没有按照我想要的方式工作。基本上,我正在制作一个程序,用于检查用户输入除了大写和小写字母和数字之外的任何内容。这个问题是不同的,因为我正在寻找如何使用Case Of语句来解决这个问题。

    for counter := 1 to lengthofpassword do
  begin
    currentletter:=password[counter];
    currentascii:=Ord(currentletter);
    if (currentascii<48) AND (currentascii>57) then
    asciipoints:=asciipoints+1;
    if (currentascii<65) AND (currentascii>90) then
    asciipoints:=asciipoints+1;
    if (currentascii<97) AND (currentascii>122) then
    asciipoints:=asciipoints+1;
    Writeln(asciipoints);
  end;

我也尝试这样做,但后来意识到这不会起作用,因为如果一个陈述得到满足,那么其他陈述就不会,而基于分数的系统也不会起作用。

3 个答案:

答案 0 :(得分:7)

很高兴你自己找到了答案。

另一种确保密码只包含大写和小写字符和数字的方法是我试图指出的:定义有效字符的set并检查密码中的每个字符是否为{{ 3}}这些有效的字符。

所以使用这样定义的集合:

const 
  ValidChars = ['A'..'Z', 'a'..'z', '0'..'9'];

您可以使用

之类的语句

if password[I] in ValidChars then

然而,此语句将在Unicode Delphi中生成编译器警告,因为集合中的类型限制为256个可能的值,并且它们的序数必须介于0到255之间。对于具有65.536的WideChar,情况并非如此。值。因此定义的set of char实际上是set of AnsiChar。对于此任务,这是可以接受的,因为需要检查的每个字符都是ASCII,因此使用函数in将不会生成编译器警告并且具有已定义的行为 - 返回False - 如果密码包含Unicode字符。

这是结果代码:

const 
  ValidChars = ['A'..'Z', 'a'..'z', '0'..'9'];
var
  I: Integer;
begin
  for I := 1 to passwordlength do
  begin
    if CharInSet(password[I], ValidChars) then  
      Writeln('valid')  // more likely to do nothing and invert the if statement
    else
    begin
      asciicheck := False;
      Break; // No need to look further, the check failed
    end;
  end;
end;

答案 1 :(得分:6)

多个范围最好用case语句表示:

begin
  for counter := 1 to lengthofpassword do
  begin
    case Ord(password[counter]) of
      48..57,
      65..90,
      97..122 :
        Writeln('valid')
      else
        asciicheck:=false;
    end;
  end;
end;

现在,这适用于角色&lt; #128。如果您正在使用unicode应用程序并且不希望字符限制为英文字母,则可以使用TCharHelper.IsLetterOrDigit

if password[counter].IsLetterOrDigit then ...

答案 2 :(得分:1)

感谢上面的评论,我找到了解决方案。我最终使用了像这样的Case Of语句:

    for counter := 1 to lengthofpassword do
  begin
    currentletter:=password[counter];
    currentascii:=Ord(currentletter);
      case currentascii of
        97..122 : asciicheck:=true;
        65..90  : asciicheck:=true;
        48..57  : asciicheck:=true;
        else asciicheck:=false;
      end;
  end;

再次感谢。