2017-10-06 170 views
2
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文を使用してこの問題を解決する方法を探していたので、この質問は異なります。Delphiでif文に複数の範囲を指定する方法は?

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; 

また、私はこのようにそれを実行しようとしましたが、その後1文が満たされた場合、他はないだろうとの点ベースのシステムは、いずれかの動作しないので、これは動作しません実現。

+0

コースの現在のトピックは何ですか?このタスクをどのように解決する必要がありますか?それ以外の場合は、charのセットを調べることができます。 – nil

+0

そのために、私は、アルファベットのために97..122のようなセットを使用してステートメントのケースを使用して終了しました –

答えて

7

幸いですが、あなた自身が答えを見つけました。

パスワードに大文字と小文字だけが含まれていることを確認するもう1つの方法は、有効な文字のsetを定義し、パスワードの各文字がinの有効な文字かどうかを確認します。

次のように定義されたセットを持つので:

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

あなたがタイプとして、しかし、Unicodeのデルファイでのコンパイラ警告を生成します

if password[I] in ValidChars then

この文のようなステートメントを使用することができますsetは256の可能な値に制限され、その順序は0から255の間でなければなりません。これは、65,536の値を持つWideCharの場合には当てはまりません。したがって、set of charは実際にはset of AnsiCharです。この作業では、チェックする必要がある文字はすべてASCIIであるため、CharInSetを使用するとコンパイラの警告は生成されず、定義された動作が返されます。パスワードにはUnicode文字が含まれていればFalseを返します。

これは、結果のコードです:

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

''!' .. '/''は、あなたがやったと似ているはずです。 33..47。私は現時点では確認できませんので、これはテストされていません。それは|と私は思うのポンド記号。 – nil

+0

伝説的な、これは魅力的なもののように機能し、許可されたすべてのシンボルをそのセットに追加しました。私はそれらを個別に追加しました。 –

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

ありがとうございました。

6

複数の範囲case文で表現さがベストです:さて、これは文字<#128のために働く

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; 

。 Unicodeアプリケーションで作業していて、英字の文字の制限を望まない場合は、TCharHelper.IsLetterOrDigitを使用することができます。

if password[counter].IsLetterOrDigit then ... 
+0

ありがとう、これは基本的に私が思い付いたものです。 –

+0

[48..57、65 ..]のOrd(パスワード[カウンタ])だけではないのはなぜですか?90、97..122] then?私はもっ​​とシンプルに見えます。セットは定数としてコンパイルされることに注意してください。 –

+0

@RudyVelthu、わからない場合は、どちらの場合でもコンパイラは同じコードを生成します。したがって、選択するソリューションは個人的な好みです。 –

関連する問題