【问题标题】:java.util.Scanner: Behavior with whitespace-only input?java.util.Scanner:只有空格输入的行为?
【发布时间】:2023-03-26 23:40:01
【问题描述】:

我尝试为 Java 课程编写一个小型解析器:解析器使用 Scanner 类:

import java.util.Scanner;
import java.io.*;

public class WC1 {

    public static void main(String[] args) throws Exception{

        File f = new File(args[0]);
        Scanner in = new Scanner(f);

        int c=0, w=0, l=0;

        while (in.hasNext()) {
            String line = in.nextLine();
            int N = line.length();

            boolean word = false;

            for (int i=0;i<N;i++) {
                char ch = line.charAt(i);
                if (ch == '\r' || ch=='\n') {
                    if (word == true) w++;
                    word = false; // do nothing
                }
                else if (ch == ' ' || ch == '\t') {
                    if (word == true) w++;
                    word = false;
                    c++;
                }
                else {
                    word = true;
                    c++;
                }
            }

            if (word == true) w++;
            word = false; // scanner consumes newline but does not return it
            c++; // scanner throws away the newline
            l++;
            System.out.println(line);
        }

        in.close();
        System.out.println("" + c + " characters");
        System.out.println("" + w + " words");
        System.out.println("" + l + " lines");
    }

}

文件1:

我用下面的三个小输入文件对其进行了测试:

异常的原因是你在使用一次扫描器后调用了keyIn.close(),这不仅关闭了Scanner,还关闭了System.in。在下一次迭代中,您将创建一个新的 Scanner,但由于 System.in 现在已关闭,它会立即爆炸。要解决这个问题,您应该只在进入 while 循环之前创建一次扫描程序,并完全跳过 close() 调用,因为您不想关闭 System.in。

修复该问题后,由于您进行了 == 和 != 字符串比较,该程序仍然无法运行。在 Java 中比较字符串时,您必须使用 equals() 来比较字符串内容。当您使用 == 和 != 时,您正在比较对象引用,因此这些比较将始终在您的代码中返回 false。始终使用 equals() 来比较字符串。

java MyClass File1.dat

779 characters
136 words
3 lines

wc File1.dat

3     136     779 test.dat

文件2:

cat
dog
goose chicken
 rat
dragon

crab

java MyClass File2.dat

47 characters
7 words
7 lines

wc File2.dat

7     7     47 File2.dat

但这不起作用:

文件3:

       |
      |
     |
    |
   |
  |
 |
|

java MyClass File3.dat

0 characters
0 words
0 lines

wc File3.dat

8     0     36 File3.dat

文件 3 仅由空格和换行符组成:管道符号表示行尾。

这里发生了什么?注意 File2 中的空行。为什么 Scanner 似乎忽略了 File3 中的空格?

【问题讨论】:

  • 会读这篇文章的人。你能给出一个摘要或jist你的问题是什么吗?
  • 只是想知道:在“文件 1:”下,您是否故意混淆?该文本是您的测试文件的全部部分,与您的问题没有特别相关性,还是其中的某些部分也用于描述您的问题?

标签: java


【解决方案1】:
while (in.hasNext()) {
    String line = in.nextLine();

在这里,您正在检查扫描仪hasNext,但在推进nextLine。这些基本上是不相关的。您发现的结果是您的第三个文件没有标记(由空格分隔的非空格),但它有行。您应该始终使用您实际使用的推进方法检查hasXXX,在您的情况下:

while (in.hasNextLine()) {
    String line = in.nextLine();

【讨论】:

    【解决方案2】:

    扫描器使用分隔符模式将其输入分解为标记,默认情况下匹配空格。然后可以使用各种 next 方法将生成的标记转换为不同类型的值。

    http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html

    【讨论】:

      猜你喜欢
      • 2014-01-17
      • 2018-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多