-1

私がやろうとしているのは、ユーザーからパスワードを取得し、4 つの条件をチェックすることです。それが正しいなら。次に、「パスワードが正しい」と出力するだけです。そうでない場合は、何が問題なのかをユーザーに示し、メニューに戻ります。問題は、メニューに戻れないことです。IF 私は while ループを行に実行します//User interface //suppose to put a while loop here, but..... System.out.println(); System.out.println("Please create a password and a legal one"。戻りますが、「if」ステートメントの一部が実行されません。私が立ち往生している場所を誰かが見ることができますか? ありがとうございました。

import java.util.Scanner;

public class Text_processing
{

    public static void main(String[] args)
    {
        Scanner kb = new Scanner(System.in);        //user input        
        String user_input;      // To hold input
        char[] array;           //Array for user_input
        int letters = 0;        // Number of letters
        int digits = 0;         // Number of digits
        boolean nu = true;      //
        boolean nl = true;
        boolean nd = true;
        boolean n7 = true;


        //User interface
        //suppose to put a while loop here, but.....
        System.out.println();
        System.out.println("Please create a password and a legal one" 
                           + " should contain the following elements:");
        System.out.println("\tAt least 7 characters in length.");
        System.out.println("\tAt least 1 upper case letter.");
        System.out.println("\tAt least 1 lower case letter.");
        System.out.println("\tAt least 1 number.");

        //Get a string from the user
        user_input = kb.nextLine();

        //Convert it to a char array
        array = user_input.toCharArray();

        for(int i = 0; i < array.length; i++)
        {
            if(!nu && !nl && !nd && !n7)
            {               
                break;
            }

            if (array.length >= 7)       //not < 7 cos breaks
            {         
                n7 = false;        
            }

            if(Character.isUpperCase(array[i]))
            {
                nu = false;             
            }

            if (Character.isLowerCase(array[i])) 
            {
                nl = false;
            }

            if (Character.isDigit(array[i])) 
            {
                nd = false;       
            }

        }

        if(n7)
        {
            System.out.println("Password does not contain 7 or more letters.");
        }
        if(nu)
        {
            System.out.println("Password does not contain an upper case letter.");
        }
        if(nl)
        {
            System.out.println("Password does not contain an lower case letter.");
        }
        if(nd)
        {
            System.out.println("Password does not contain a number.");
        }

            System.out.println("Password is correct.");


    }
}
4

7 に答える 7

2

現在のコードでは、メイン ループの反復ごとに、、、、がリセットされるようにnuする必要があります。nlndn7

boolean badPassword = false;
do {
    boolean nu = true;
    boolean nl = true;
    boolean nd = true;
    boolean n7 = true;
    /*
     * Add everything from your code that appears below `boolean n7 = true;`
     * and above System.out.println("Password is correct."); here...
     */

    badPassword = (n7 || nu || nl || nd);
} while (badPassword);
System.out.println("Password is correct.");
于 2013-09-19T04:01:55.110 に答える
0

この状況の標準的なパターンは次のとおりです。

Scanner sc = new Scanner(System.in);
String userInput = null;
while (true) {
    System.out.println("please enter something:");
    userInput = sc.next();
    if (<input fails some test>) {
        System.out.println("some reason");
        continue; // try again
    }
    // repeat other tests similarly
    break; // will only get to here if input was OK
}

ループは、有効な入力が入力されるまで終了できません。その後、userInputその値が保持されます。

また、プロンプトをループ内に配置することで、無効な入力でのコードの重複を回避できることにも注意してください。

于 2013-09-19T04:06:15.450 に答える
0

このようにパスワードを確認する簡単な方法を書きます。

private static boolean isValid(char[] array) {
    if(array.length<7){
        return false;
    }
    else{
        boolean isUpper=false, isLower=false, isDigit=false;
        for (int i = 0; i < array.length; i++) {
            char c = array[i];
            if(Character.isUpperCase(c)){
                isUpper=true;
            }
            if(Character.isLowerCase(c)){
                isLower=true;
            }
            if(Character.isDigit(c)){
                isDigit=true;
            }
        }
        return isUpper && isLower && isDigit;
    }
}
于 2013-09-19T04:06:50.683 に答える
0

while ループを次から開始することの何が問題になっていますか。

String user_input;      // To hold input

次の前に終了します。

        System.out.println("Password is correct.");
于 2013-09-19T03:54:30.920 に答える
0

なぜその特定の理由で行く必要があるのか​​ 、コンテンツを表示した後、パスワードはどうあるべきか.

「パスワードが上記の基準を満たしていません。もう一度お試しください」と印刷するだけです。

十分だと思います

于 2013-09-19T04:04:08.553 に答える
0

個人的には、あなたが書いたコードは、このような単純なチェックには長すぎると感じています。

ただし、有効なフラグが true であるかどうかを確認し、最後にキーボード入力を読み取る while ループを配置できる場合にのみ、問題を手動で修正できます。

以下のコードのようなもの:

boolean valid = false;
while (!valid) {

        for (int i = 0; i < array.length; i++) {
            valid = true;
            if (!nu && !nl && !nd && !n7) {
                break;
            }

            if (array.length >= 7) // not < 7 cos breaks
            {
                n7 = false;
            }

            if (Character.isUpperCase(array[i])) {
                nu = false;
            }

            if (Character.isLowerCase(array[i])) {
                nl = false;
            }

            if (Character.isDigit(array[i])) {
                nd = false;
            }

        }

        if (n7) {
            valid = false;
            System.out
                    .println("Password does not contain 7 or more letters.");
        }
        if (nu) {
            valid = false;
            System.out
                    .println("Password does not contain an upper case letter.");
        }
        if (nl) {
            valid = false;
            System.out
                    .println("Password does not contain an lower case letter.");
        }
        if (nd) {
            valid = false;
            System.out.println("Password does not contain a number.");
        }
        if (!valid) {
            user_input = kb.nextLine();
            array = user_input.toCharArray();
        }
    }
于 2013-09-19T04:10:38.307 に答える
0

むしろ、ループを使用して文字列全体をチェックすることさえできますString.matches()。これにより、ロジックが大幅に簡素化されます

そのようです

//For uppercase
user_input.matches(".*[A-Z].*"); // true if contians

//For lowercase
user_input.matches(".*[a-z].*"); // true if contians

//For digit
user_input.matches(".*\\d.*");  // true if contians
于 2013-09-19T04:11:38.923 に答える