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 循环,然后显示一个随机字符,而不管输入的长度如何。

4

3 回答 3

2

不,循环正在运行多次迭代 - 但在每次迭代中,您都在创建一个新的 StringBuilder:

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

请注意,有时,我希望循环抛出异常 - 如果没有,你最终会得到一个比你想要的更长的字符串。基本上,您会遇到三个不相上下的错误……您应该有:

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 循环之外。b每次运行 for 循环时都会创建您拥有它的方式。

于 2013-09-10T12:34:18.863 回答
0

您总是b在循环中重新创建对象。它总是只包含一个字符。

于 2013-09-10T12:34:36.220 回答