简单JAVA:密码验证程序问题

简单JAVA:密码验证程序问题,java,string,passwords,Java,String,Passwords,我有一个简单的问题,就是: xyz公司的密码应为6个字符长,由字母和数字组成。编写一个程序片段,读入一个字符串并打印出一条消息,说明输入的字符串是否被视为有效密码 我需要有关完成此代码的帮助。我有一个伪代码,我无法将其转化为Java代码: print "enter new password" input newPassword digitCounter =0 letterCounter = 0 for I = 0 to newPassword.length() by 1 c = newP

我有一个简单的问题,就是:

xyz公司的密码应为6个字符长,由字母和数字组成。编写一个程序片段,读入一个字符串并打印出一条消息,说明输入的字符串是否被视为有效密码

我需要有关完成此代码的帮助。我有一个伪代码,我无法将其转化为Java代码:

print "enter new password"
input newPassword
digitCounter =0
letterCounter = 0
for I = 0 to newPassword.length() by 1
    c = newPassword.charAt(i)
    if c is a digit
        increment digitCounter
    else if c is a letter
        increment letterCounter
    endif
endFor
if newPassword.length() >= 6 and digitCounter > 0 and letterCounter > 0
    print "the password is valid"
else
    print " password rejected, must be at least 6 characters long and be a mix of letters and digits "
endif
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

到目前为止,我的Java代码只有以下内容:

import java.util.Scanner;

public class Password 
{
    public static void main(String[] args)
    {
        Scanner in = new Scanner(System.in);

        String thePassword;

        int len, i, letterCounter = 0, digitCounter = 0;
        char c;

        Len = thePassword.length();

        System.out.print("Enter the password: ");
        thePassword = in.nextLine();

        for (i = 0,i = len, )
        {
            c = in.charAt(1);

            if ()
        }

    }
}
查看和检查字符:

如果要使用获取字符串的字符,可以执行如下for循环:

for (int i = 0;i < s.length();i++) {
    char c = s.charAt(i);
    //Check things about c
}
查看和检查字符:

如果要使用获取字符串的字符,可以执行如下for循环:

for (int i = 0;i < s.length();i++) {
    char c = s.charAt(i);
    //Check things about c
}

我将检查正则表达式\d是否为任意数字,正则表达式[a-z]是否为任意字母是否与字符串匹配。然后检查长度。

我会检查正则表达式\d是否有任何数字,正则表达式[a-z]是否有任何字母都与字符串匹配。然后检查长度。

一些快速提示:

您的伪代码算法不正确。它将正确验证字符串的长度必须至少为6个字符,但不会使包含奇怪字符(例如~%)的密码无效。根据问题陈述,由字母和数字组合而成的句子似乎隐含着仅由字母和数字组成的意思。对于这一部分,正如其他人提到的,您可以使用String或Character类的内置方法,如String.charAt、Character.isDigit和Character.Isleter

养成一种习惯,在可能的最晚时间,即在使用前申报物品。在您的示例中,您有字符串thePassword,然后是另外两行,然后您为password分配了一些内容。相反,直接将其写入字符串thePassword=in.nextLine。这将有助于减少代码的混乱,使其更易于阅读。对于其他声明char c、int len等也是如此

如果可以的话,尝试使用增强的for循环,以避免必须计算长度并确定在何处停止潜在的错误。在您的示例中,您的循环可能类似于for char c:thePassword.tocharray。如果你还没有在课堂上讨论过这个循环,你就不必使用它,你也应该知道简单for循环是如何工作的,但这只是一个建议。在您的代码示例中,您的循环没有意义,因此我建议您仔细阅读循环

以下是一些快速提示:

您的伪代码算法不正确。它将正确验证字符串的长度必须至少为6个字符,但不会使包含奇怪字符(例如~%)的密码无效。根据问题陈述,由字母和数字组合而成的句子似乎隐含着仅由字母和数字组成的意思。对于这一部分,正如其他人提到的,您可以使用String或Character类的内置方法,如String.charAt、Character.isDigit和Character.Isleter

养成一种习惯,在可能的最晚时间,即在使用前申报物品。在您的示例中,您有字符串thePassword,然后是另外两行,然后您为password分配了一些内容。相反,直接将其写入字符串thePassword=in.nextLine。这将有助于减少代码的混乱,使其更易于阅读。对于其他声明char c、int len等也是如此

如果可以的话,尝试使用增强的for循环,以避免必须计算长度并确定在何处停止潜在的错误。在您的示例中,您的循环可能类似于for char c:thePassword.tocharray。如果你还没有在课堂上讨论过这个循环,你就不必使用它,你也应该知道简单for循环是如何工作的,但这只是一个建议。在您的代码示例中,您的循环没有意义,因此我建议您仔细阅读循环


我将假设您只是从命令行参数中读取,如果您需要它能够接受多个密码,您可以对其进行泛化。以下是我将如何轻松做到这一点:

public class Password {
    public static void main(String[] args) {
        String thePassword = args[0];
        int passLength = thePassword.length();
        boolean hasLetters = false;
        boolean hasDigits = false;
        boolean hasSomethingElse = false;

        for (int i=0; i < passLength; i++) {
            char c = thePassword.charAt(i);
            if(Character.isLetter(c)) hasLetters = true;
            else if(Character.isDigit(c)) hasDigits = true;
            else hasSomethingElse = true;
        }

        if (hasLetters && hasDigits && !hasSomethingElse && (passLength >= 6)) {
            System.out.println("Password is correctly formatted");
        } else {
            System.out.println("Password is not correctly formatted");
        }
    }
}

我将假设您只是从命令行参数中读取,如果您需要它能够接受多个密码,您可以对其进行泛化。以下是我将如何轻松做到这一点:

public class Password {
    public static void main(String[] args) {
        String thePassword = args[0];
        int passLength = thePassword.length();
        boolean hasLetters = false;
        boolean hasDigits = false;
        boolean hasSomethingElse = false;

        for (int i=0; i < passLength; i++) {
            char c = thePassword.charAt(i);
            if(Character.isLetter(c)) hasLetters = true;
            else if(Character.isDigit(c)) hasDigits = true;
            else hasSomethingElse = true;
        }

        if (hasLetters && hasDigits && !hasSomethingElse && (passLength >= 6)) {
            System.out.println("Password is correctly formatted");
        } else {
            System.out.println("Password is not correctly formatted");
        }
    }
}

如果这是家庭作业,请添加家庭作业标签。我看到了你的伪代码,还以为是Python。。。我很困惑,因为标题是Java!如果这是家庭作业,请添加家庭作业标签。我看到了你的伪代码,还以为是Python。。。我很困惑,因为标题是Java!我会先做密码长度检查。i、 e在for循环之前。只有当大于等于6时,我才会检查字母和数字。是吗?我考虑过,但我怀疑在这样一个简单的情况下,它会对函数的计算速度产生很大的影响。这个
它现在的样子非常简洁明了。我想您可以将for循环括在if pass length>=6中。如果这是一个单独的函数,而不仅仅是在main内部完成的,那么您可以在If内部返回true或false,如果跳出它,则始终返回false。我会首先检查密码长度。i、 e在for循环之前。只有当大于等于6时,我才会检查字母和数字。是吗?我考虑过,但我怀疑在这样一个简单的情况下,它会对函数的计算速度产生很大的影响。现在的方式非常简洁明了。我想您可以将for循环括在if pass length>=6中。如果这是一个单独的函数,而不仅仅是在main内部完成的,那么可以在If内部返回true或false,如果跳出它,则始终返回false。