-2

大文字と数字で始まる出力が必要なプログラムを作成しました。次に、許可された文字からランダムに生成します。

しかし、出力には次のようなスペースが含まれていることがわかりましたk r w ea。私が期待したのに対し:W3krwea

これらのスペースが出力に表示される理由がわかりません。

import java.util.Random;
import sun.security.util.Password;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author taskin
 */

    public class RPG
{

    public static String generate(String allowedCharacters,
                                  boolean mustHaveUppercase, boolean mustHaveDigit,
                                  int minLength, int maxLength)
    {
        Random rand=new Random();
        String rp = null; // Random Password
        int Length=allowedCharacters.length();
        char[] password=new char[25];
        int [] asc=new int[18];
        char[] UpperCase=new char[25];
        char[] Digit=new char[25];
        char[] Mixed=new char[25];
        int point1=0,point2=0,point3=0;

        for (int i=0;i<Length;i++)
        {
            asc[i]=(int)allowedCharacters.charAt(i);

        }
        for (int k=0;k<Length;k++)
        {
            if (asc[k]>=65 && asc[k]<=90)
            {
                UpperCase[point1]=(char)asc[k];
                point1++;
                continue;
            }
            else if (asc[k]>=48 && asc[k]<=57)
            {
                Digit[point2]=(char)asc[k];
                point2++;
                continue;
            }
            else
            {
                Mixed[point3]=(char)asc[k];
                point3++;
            }

        }
        StringBuilder strbld=new StringBuilder();
        int length=maxLength-minLength+1+minLength;
        strbld.append(UpperCase[rand.nextInt(UpperCase.length)]);//get a uppercase char
        strbld.append(Digit[rand.nextInt(Digit.length)]);//get a digit
        for(int i=0;i<length-2;i++){
            strbld.append(Mixed[rand.nextInt(Mixed.length)]);
        }
        rp=strbld.toString();

        // Your code to set rp appropriately goes here

        return rp;
    }

    public static void main(String[] args)
    {
        String allowedCharacters = "weakPasSWorD1234$*";
        boolean mustHaveUppercase = true;
        boolean mustHaveDigit = true;
        int minLength = 3;
        int maxLength = 20;
        String randomPassword = generate(allowedCharacters,
                                         mustHaveUppercase, mustHaveDigit, minLength,
                                         maxLength);
        System.out.println("Random password: " + randomPassword);
    }
}
4

1 に答える 1

1

使用.lengthしているものは、配列の全長を返します。Charこれは約 25 文字です。しかし、実際には、長さは約 4 ~ 5 文字です。したがって、空白が発生します。注:機能は同じではありません.length()(誤解されていると思います。)

このスレッドを見て、コンセプトを明確にしてください。

ループで使用したものと同じ長さを使用してください。StringBuilderブロックを次のように変更します。

    StringBuilder strbld=new StringBuilder();
    int length=maxLength-minLength+1+minLength;
    System.out.println("n     "+strbld.append(UpperCase[rand.nextInt(point1)]));//;

    //get a uppercase char
    strbld.append(Digit[rand.nextInt(point2)]);
    for(int i=0;i<length-2;i++){
        strbld.append(Mixed[rand.nextInt(point3)]);

出力:

  W1aearere$karasa$akke

空白なし。

于 2013-01-22T17:56:17.443 に答える