Java:对Scanner的useDelimiter()方法的疑问
迷茫
迷茫 2017-04-17 15:19:12
0
2
391

输入字符串

_ _ _ _one _ two\n  // "_"表示空格,"\n"表示回车

未设置useDelimiter()的情况

Scanner scanner = new Scanner(System.in);
String str = scanner.next();

输出字符串str得到"one",str.length()等于3,可知最后的"\n"并未扫描进来

设置useDelimiter("\n");的情况

Scanner scanner = new Scanner(System.in);
scanner.useDelimiter("\n");     
String str = scanner.next();

输出字符串str得到"_ _one _ two",长度为12,可知最后的"\n"被扫描进来了

这是为什么呢?

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全部回复(2)
PHPzhong
  1. Windows下,我们在键盘上按下Enter键,实际上输入的是回车和换行两个字符:rn,ASCII码分别是13和10

  2. 默认情况下,Scanner获取到的输入里面是不包含回车换行的。比如你输入____one_tworn,它只会从____one_two里面获取输出(当然,可能要通过多次next()来获取),自动把回车换行过滤掉了

  3. 但是当我们强制以回车或换行为分隔符时,它就不会自动过滤回车换行符了。比如你以回车符n为分隔符的话,输入上面的内容会得到____one_twor,这也就是返回的length为12的原因。可以用下面的程序来验证,可以发现获取到的字符串的最后一个字符ASCII码为13,表示它是一个回车符r

// 输入`____one_two\r\n`来测试
Scanner scanner = new Scanner(System.in);
scanner.useDelimiter("\n");
String str = scanner.next();
// 打印获取到的内容和其长度,以及最后一个字符的ASCII码
System.out.println(str + ":" + str.length()
        + " (" + str.codePointAt(str.length()-1) + ")");

解决方法:用rn作为分隔符就正常了

伊谢尔伦

Windows下回车是 rn

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!