1
import java.util.Random;
import java.util.Scanner;

public class PassGen {
public static void main(String[] args) {
    String[] characters = {"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","0","1","2","3","4","5","6","7","8","9"};
    StringBuilder b = null;

    Scanner scan = new Scanner(System.in);
    System.out.println("Enter password length.");
    int length = scan.nextInt();
    while (length > 20 || length < 6) {
        System.out.println("Password must be between 6 and 20 characters long.");
        length = scan.nextInt();
    }

    Random rand = new Random();

    for (int i = 0; i <= length; i++) {
        int x = rand.nextInt(characters.length) + 1;
        b = new StringBuilder(length + 1);
        String s = characters[x];
        b.append(s);
    }

    System.out.println("Your password is: " + b.toString());
}
}

何らかの理由で、このプログラムを実行すると、入力された長さに関係なく、単一のランダムな文字が表示される前に、for ループが 1 回だけ実行されます。

4

3 に答える 3

2

いいえ、ループは複数の反復を実行していますが、反復ごとに新しい StringBuilder を作成しています。

// This is inside the loop, but should be outside.
b = new StringBuilder(length + 1);

場合によっては、ループが例外をスローすると予想されることに注意してください。そうでない場合は、とにかく必要以上に長い文字列になってしまいます。基本的に、3 つの off-by-one エラーがあります。

b = new StringBuilder(length);
for (int i = 0; i < length; i++) {
    int x = rand.nextInt(characters.length);
    b.append(characters[x]);
}

また、文字列の配列ではなく文字列を使用して、次のようにすると、より簡単になることに注意してくださいcharAt

String characters = "ABCDE...9";
...

int x = rand.nextInt(characters.length());
b.append(characters.charAt(x));
于 2013-09-10T12:34:09.087 に答える
0
    b = new StringBuilder(length + 1);

for ループの外にある必要があります。bfor ループが実行されるたびに作成されます。

于 2013-09-10T12:34:18.863 に答える
0

常にbループ内でオブジェクトを再作成します。常に 1 文字のみが含まれます。

于 2013-09-10T12:34:36.220 に答える