【问题标题】:Java Scanner useDelimiter unexpected resultJava Scanner useDelimiter 意外结果
【发布时间】:2019-04-24 16:09:34
【问题描述】:

当我们像这样将字符串传递给扫描仪时,我们得到 'ab' 作为控制台输出:

 public static void main(String []args){
    Scanner sc = new Scanner("a///b");
    sc.useDelimiter("/");

    System.out.print(sc.next());    
    System.out.print(sc.next());    
    System.out.print(sc.next());    
    System.out.print(sc.next());    
    sc.close();
 }

但是如果我们把扫描线改为

Scanner sc = new Scanner(System.in);

并传入相同的字符串a///b

仅控制台输出“a”。 控制台期望输入另一个 / 以输出相同的值。

为什么它们的工作方式不同?

【问题讨论】:

    标签: java java.util.scanner delimiter


    【解决方案1】:

    String 上的 Scanner 在读取 'b' 字符时已到达其输入的末尾。但是当你在System.in 上使用Scanner 时,流还没有结束;您仍然可以在换行符后输入更多内容。

    如果您输入a///b Enter,您仍然可以输入另一个分隔符/,这将最终让Scanner 知道令牌已完成。如果您输入foo/,则下一个令牌是"b\nfoo",说明Scanner 知道b 只是下一个令牌的开始,直到另一个/ 到达流。

    在这里,我在所有输出周围放置了双引号,以显示找到的每个标记,即使是空的。

    a///b    <- input; token starting with "b" is unfinished
    "a"      <- output
    ""       <- output
    ""       <- output
    foo/     <- input
    "b       <- output
    foo"     <- output
    

    【讨论】:

    • 我意识到我还可以添加 EOF(Windows 上的 Control + Z 或 Mac 上的 Control + D)来完成输入。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-31
    • 1970-01-01
    相关资源
    最近更新 更多