》概述

  在实现字符窗口的输入时,我个人更喜欢选择使用扫描器Scanner,它操作起来比较简单。我发现用Scanner实现字符串的输入有两种方法,一种是next(),一种nextLine(),但是这两种方法究竟有什么区别呢?

  》》1.首先,next()一定要读取到有效字符后才可以结束输入,对输入有效字符之前遇到的空格键、Tab键或Enter键等结束符,next()方法会自动将其去掉,只有在输入有效字符之后,next()方法才将其后输入的空格键、Tab键或Enter键等视为分隔符或结束符。简单地说,next()查找并返回来自此扫描器的下一个完整标记。完整标记的前后是与分隔模式匹配的输入信息,所以next方法不能得到带空格的字符串;而nextLine()方法的结束符只是Enter键,即nextLine()方法返回的是Enter键之前的所有字符,它是可以得到带空格的字符串的。

》举例说明

  鉴于以上两种方法的只要区别,同学们一定要注意next()方法和nextLine()方法的连用,下面举个例子来说明:

 import java.util.Scanner;

 public class Test_next {
public static void main(String[] args) {
String s1,s2;
Scanner scanner=new Scanner(System.in);
System.out.println("请输入第一个字符串:");
s1=scanner.next();
System.out.println("请输入第二个字符串:");
s2=scanner.nextLine();
System.out.println("输入的字符串是:"+s1+s2);
} }

测试代码

 请输入第一个字符串:
home
请输入第二个字符串:
输入的字符串是:home

运行结果

》结论

  nextLine()自动读取了被next()去掉的Enter作为他的结束符,所以没办法给s2从键盘输入值。

  经过验证,其他的next的方法,如double nextDouble()  , float nextFloat() , int nextInt() 等与nextLine()连用时都存在这个问题。

》解决的办法

在每一个 next()、nextDouble()  、 www.gzlij.com()、nextFloat()、nextInt() 等语句之后加一个nextLine()语句,将被next()去掉的Enter结束符过滤掉

 import java.util.Scanner;

 public class Test_next {
public static void main(String[] args) {
String s1,s2;
Scanner scanner=new Scanner(System.in);
System.out.println("请输入第一个字符串:");
s1=scanner.next();
scanner.nextLine();
System.out.println("请输入第二个字符串:");
s2=scanner.nextLine();
System.out.println("输入的字符串是:"+s1+s2);
} }

测试代码

 请输入第一个字符串:
home
请输入第二个字符串:
work
输入的字符串是:homework

运行结果

》 应用举例

 package atest.dak.com;

 import java.util.Arrays;
import java.util.Scanner; /*
* 随机生成指定位数的验证码
* 提醒用户输入
* 判断用户输入是否正确
*/
public class Test{
public static void main(String[] args){
Scanner scan = new Scanner(System.in); System.out.print("请输入随机产生的验证码的个数:");
int number = scan.nextInt(); char[] arr_of_random = randome_num(number); //获取随机验证码
System.out.println(Arrays.toString(arr_of_random)); //打印随机验证码 System.out.print("请输入验证码:"); /*
* 注意:由于之前进行输入的时候是用回车作为结束的,所以如果用nextline()的话就会
* 将上一次的结束的回车作为这次的输入,又因为nextline()的结束也是回车,所以
* 在这里通过nextline()作为输入函数是不会得到任何输入值的;因此我们用next()
* 作为这里的输入函数可以有效的避免这种问题。
*/
String answer = scan.next(); //获取输入字符串
char[] arr_of_answer = answer.toCharArray(); //将输入字符串转化成字符数组
System.out.println(Arrays.toString(arr_of_answer)); //打印输入字符数组 int[] result = match(arr_of_answer, arr_of_random);
System.out.println(Arrays.toString(result)); } // 产生所有小写字母
private static void f1(){
for(int i = 97; i < 97 + 26; i++){
System.out.print("\'"+(char)i+"\'"+",");
}
} // 产生所有大写字母
private static void f2(){
for(int i = 65; i < 65 + 26; i++){
System.out.print("\'"+(char)i+"\'"+",");
}
} // 随机产生指定个数的验证码
private static char[] randome_num(int figure){
char[] cha01 = {'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','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'};
boolean[] used = new boolean[cha01.length];
char[] cha02 = new char[figure];
for(int i = 0; i < cha02.length; i++){
int j; //进行去重复处理
do{
j = (int)(Math.random()*(cha01.length));
}while(used[j]); cha02[i] = cha01[j];
used[j] = true;
}
return cha02;
} // 对随机验证码和输入的验证码进行匹配
private static int[] match(char[] answer, char[] random){
int[] result = new int[2];
for(int i = 0; i < answer.length; i++){
for(int j = 0; j < random.length; j++){
if(random[j] == answer[i]){
result[0]++;
if(j == i){
result[1]++;
}
}
}
}
return result;
}
}

随机验证码的匹配

java中nextLine()和next()的区别的更多相关文章

  1. java中nextLine()与next()的区别

    java中的next()和nextLine()还是有很大区别的. next()一定要读取到有效字符后才可以结束输入,对输入有效字符之前遇到的空格键.Tab键或Enter键等结束符,next()方法会自 ...

  2. Java中Set Map List 的区别

    java中set map list的区别: 都是集合接口 简要说明 set --其中的值不允许重复,无序的数据结构 list   --其中的值允许重复,因为其为有序的数据结构 map--成对的数据结构 ...

  3. Java中Comparable和Comparator接口区别分析

    Java中Comparable和Comparator接口区别分析 来源:码农网 | 时间:2015-03-16 10:25:20 | 阅读数:8902 [导读] 本文要来详细分析一下Java中Comp ...

  4. 转:Java中abstract和interface的区别

    转自:Java中abstract和interface的区别 abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java ...

  5. Java中this与super的区别【6】

    若有不正之处,请多多谅解并欢迎批评指正,不甚感激.请尊重作者劳动成果: 本文原创作者:pipi-changing本文原创出处:http://www.cnblogs.com/pipi-changing/ ...

  6. Java中堆和栈的区别(转)

    栈与堆都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆.      Java的堆是一个运行时数据区,类的对象从中分配空间.这些对象通过new. ...

  7. 转:二十一、详细解析Java中抽象类和接口的区别

    转:二十一.详细解析Java中抽象类和接口的区别 http://blog.csdn.net/liujun13579/article/details/7737670 在Java语言中, abstract ...

  8. Java中Long与long的区别(转)

    Java中Long与long的区别(转) [本文转载自:http://www.cnblogs.com/bluestorm/archive/2012/04/22/2464739.html] 转载请联系原 ...

  9. java中堆和堆栈的区别

    java中堆和堆栈的区别(一) 1.栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆. 2. 栈的优势是,存取 ...

随机推荐

  1. gson 简要使用

    http://www.cnblogs.com/chenlhuaf/archive/2011/05/01/gson_test.html 发现了google的gson,因为之前对于protocolbuf有 ...

  2. 江西理工大学南昌校区acm选拔赛题解

    第一题略 第二题 #include<stdio.h> int main() { int a1,a2,a3,b1,b3,b2,c1,c2,c3,n,sum,d1,d2,d3,i; scanf ...

  3. Mac下android_sdk配置环境变量

    1.启动Terminal终端工具 2.输入cd ~/ 进入当前用户的home目录 3. 创建: touch .bash_profile 4.打开并编辑: open .bash_profile 5.在文 ...

  4. 为什么我们要使用min-height和max-height样式属性?

    Css min-height应用地方解释我们有时设置一个对象盒子时候避免对象没有内容时候不能撑开,但内容多少不能确定所以又不能固定高度,这个时候我们就会需要css来设置min-height最小高度撑高 ...

  5. 【BZOJ】1135: [POI2009]Lyz

    题意 有\(1\)到\(n(1 \le n \le 200000)\)号的溜冰鞋各\(k(1 \le k \le 10^9)\)双.已知\(x\)号脚的人可以穿\(x\)到\(x+d\)的溜冰鞋. 有 ...

  6. 【Eclipse】 Alt+/ 代码提示问题解决方案

    一般情况下alt+/有代码提示作用,还有代码提示的快捷代码也不是alt+/,因此要恢复代码提示用alt+/.需要做两件事. 在 Window - Preferences - General - Key ...

  7. vsfptd

    如果想通过vsftpd来在主机和虚拟机之间拿数据,可以通过这种方法: 在主机的资源管理器中输入:ftp://虚拟机里面Linux的IP(如192.168.2.112)/ 如果反过来,需要如下:ftp: ...

  8. SQL Server 父子迭代查询语句,树状查询(转)

    -- Get childs by parent id WITH Tree AS ( SELECT Id,ParentId FROM dbo.Node P WHERE P.Id = -- parent ...

  9. java实现BitMap

    package bitmap; public class BitMap { private byte[] bytes; public BitMap(byte[] bytes) { super(); t ...

  10. [转] - MC、MC、MCMC简述

    贝叶斯集锦(3):从MC.MC到MCMC 2013-07-31 23:03:39 #####一份草稿 贝叶斯计算基础 一.从MC.MC到MCMC 斯坦福统计学教授Persi Diaconis是一位传奇 ...