写了个很简单的验证码的代码,高手大神们看看,指点指点 *-* 谢谢
public static void main(String[] args) { //生成验证码(4位) char[] codes={'3','4','5','6','7','8','a','b','c', 'd','e','f','h','i','j','k','m', 'n','p','q','r','s','t','u','v', 'w','x','y','z','A','B','C','D','E','F', 'G','H','I','J','K','M','N','P','Q','R', 'S','T','U','V','W','X','Y'}; int n=4; char[] ver=new char[n]; int index=0; int i; Random random=new Random(); boolean[] used=new boolean[codes.length]; do{ i=random.nextInt(codes.length); if(used[i]){ continue; } ver[index++]=codes[i]; used[i]=true; }while(index!=ver.length); System.out.println(ver[0]+" "+ver[1] +" "+ver[2]+" "+ver[3]); //获取用户输入 Scanner console=new Scanner(System.in); String input; do{ System.out.print("请输入验证码:"); input=console.nextLine(); input=input.trim(); }while(input.length()!=ver.length); char[] inp=input.toCharArray(); //System.out.println(inp); //设置忽略大小写 //char ch; for(i=0;i<ver.length;i++){ if(inp[i]-ver[i]=='A'-'a' || inp[i]-ver[i]=='a'-'A'){ inp[i]=ver[i]; } } System.out.println( Arrays.toString(ver)); System.out.println( Arrays.toString(inp)); String in=new String(inp); String check=new String(ver); if(in.equals(check)){ System.out.println("OK!"); }else{ System.out.println("输入错误!"); } } }
你想要什么? 逻辑上看,没什么问题。忽略大小写那块可以改进。 还有,验证码一般允许重复,不需要用标识(当然,如果想唯一,就需要标记一下)
我是想知道自己这样写的,有没有更好的思路,或者更简单一点的代码。(第一次试着写的东西,所以拿出来问问。呃。。以后,一定多想想,拿深一点层次来请教 不然,都有点不好意思...*-*)
@小小工程师: 思路没什么问题,改进的地方我上面也说了。多写,多思考。
@幻天芒: 哦,我想问问,那个忽略大小写,应该怎么改进,当时写的时候,思路还搞错了。没能想到其它的,来换,简化它
@小小工程师: String应该直接由忽略大小写的比较吧,
@幻天芒: 不太明白啊,能不能单独上下代码啊?Stirng我学了,但理解得还不太深,运用比较欠缺啊。可以上下估代码,给个思路吗? 谢谢哒
@小小工程师: public boolean equalsIgnoreCase(String anotherString)
var b="Test".equalsIgnoreCase("test"); //true
@幻天芒: equalsIgnoreCase()忽略大小写..这个方法看过一次,但是忘记了。谢谢,我去试试*-*
这段代码是一个生成并验证验证码的程序。它的思路是:
codes
,包含了验证码可能包含的字符。n
,表示验证码的位数。ver
,用于存储生成的验证码。used
,用于记录已使用的字符。do-while
循环来生成验证码,直到生成了指定位数的验证码为止。
random.nextInt(codes.length)
生成一个随机数i
,表示随机选择一个字符的索引。ver
数组中,并将该字符标记为已使用。Scanner
读取用户输入的验证码。do-while
循环来获取用户输入的验证码,直到输入的验证码位数与生成的验证码位数相等为止。inp
。ver
和用户输入的验证码数组inp
转换为字符串,并进行比较。以下是更简单的实现思路:
StringBuilder
来生成验证码。for
循环生成指定位数的验证码:
index
,表示从codes
数组中随机选择一个字符的索引。append
方法将选中的字符添加到StringBuilder
对象中。Scanner
读取用户输入的验证码。trim
方法去除用户输入字符串的前后空格。以下是按照上述思路简化后的代码示例:
public static void main(String[] args) {
// 生成验证码(4位)
StringBuilder ver = new StringBuilder();
char[] codes = {'3', '4', '5', '6', '7', '8', 'a', 'b', 'c',
'd', 'e', 'f', 'h', 'i', 'j', 'k', 'm',
'n', 'p', 'q', 'r', 's', 't', 'u', 'v',
'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F',
'G', 'H', 'I', 'J', 'K', 'M', 'N', 'P', 'Q', 'R',
'S', 'T', 'U', 'V', 'W', 'X', 'Y'};
int n = 4;
Random random = new Random();
for (int i = 0; i < n; i++) {
int index = random.nextInt(codes.length);
ver.append(codes[index]);
}
System.out.println(ver.toString());
// 获取用户输入
Scanner console = new Scanner(System.in);
String input;
do {
System.out.print("请输入验证码:");
input = console.nextLine().trim();
} while (input.length() != ver.length());
if (input.equalsIgnoreCase(ver.toString())) {
System.out.println("OK!");
} else {
System.out.println("输入错误!");
}
}
这段代码使用了StringBuilder
更简单地生成验证码,并使用equalsIgnoreCase
方法进行大小写忽略的比较,从而简化了原有代码逻辑。