》概述

  在实现字符窗口的输入时,我个人更喜欢选择使用扫描器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. 再探CSS 中 class 命名规范

    一直以来我的CSS 的 class命名都是比较随意,有时采用驼峰式.有时采用下划线,好像没有什么统一的标准,想到什么英文单词就拿过来用,这对于自己瞎写的小项目无伤大雅,遇到冲突的问题可稍加调整改变即可 ...

  2. Bug:播放页面自动跳到首页

    一,经历: 1.第一感觉就是从直播间中收到了通知,然后通知得知了用户未登录,直播间便 pop 退出了. 2.由于这个问题是很难复现的,研究了快一个星期后,才发现是直播间底部的我的历史页面中接收到了直播 ...

  3. MongoDB使用操作

    一.mongodb常用命令 http://www.cnblogs.com/cxd4321/archive/2011/06/24/2089051.html 二.MongoDB基本使用 http://ww ...

  4. js文字无缝滚动

    <div id=demo style="overflow:hidden; width:128px; height:300px;"> <div id=demo1&g ...

  5. ECMAScript中关于如何获取this的定义

    文章中一些名词的翻译存疑,没有查过正式的中文名称 前面都是具体过程的解释,懒得看可以直接看获取思路 有关this的取值请移步JavaScript笔记--this的取值 获取this的过程 Runtim ...

  6. [转][LeetCode]Longest Common Prefix ——求字符串的最长公共前缀

    题记: 这道题不难但是很有意思,有两种解题思路,可以说一种是横向扫描,一种是纵向扫描. 横向扫描:遍历所有字符串,每次跟当前得出的最长公共前缀串进行对比,不断修正,最后得出最长公共前缀串. 纵向扫描: ...

  7. 李洪强漫谈iOS开发[C语言-047]-数列求和

    // //  main.c //  53 - 数列求和 - 李洪强 // //  Created by vic fan on 16/10/15. //  Copyright © 2016年 李洪强. ...

  8. Objective-c的内存管理MRC与ARC

    Objective-c的内存管理MRC与ARC   Objective-c中提供了两种内存管理机制MRC(MannulReference Counting)和ARC(Automatic Referen ...

  9. express3.0安装并使用layout模板

    转自:http://cnodejs.org/topic/5073989b01d0b801480520e4 1.安装 express-partials. 方法一:运行 cmd 用 npm install ...

  10. css中margin-left与left的区别

    研究下拉菜单和弹出菜单时比较所得: 1.直接在css中设置left生效的前提是必须设置父容器position:absolute或relative,如果不设置则会显示为最近一个定位的父对象左边相关的位置 ...