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;
我也尝试这样做,但后来意识到这不会起作用,因为如果一个陈述得到满足,那么其他陈述就不会,而基于分数的系统也不会起作用。
答案 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;
再次感谢。