当前位置: 首页 > 知识库问答 >
问题:

scanner:只输入空格的行为?

杜轩昂
2023-03-14

我尝试为一门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(),这不仅关闭了扫描器,还关闭了System.in。在下一次迭代中,您创建了一个新的扫描器,由于System.In现在关闭了,该扫描器很快就会崩溃。要解决这个问题,您应该做的是在进入while循环之前只创建一次扫描程序,并且完全跳过close()调用,因为您不想关闭system.in。

修复后,程序仍然无法工作,因为您要进行==和!=字符串比较。在Java中比较字符串时,必须使用equals()来比较字符串内容。当您使用==和!=时,您正在比较对象引用,因此这些比较在代码中总是返回false。始终使用equals()来比较字符串。

Java MyClass文件1.dat

779 characters
136 words
3 lines

wc文件1.dat

3     136     779 test.dat

文件2:

cat
dog
goose chicken
 rat
dragon

crab

Java MyClass文件2.dat

47 characters
7 words
7 lines

wc文件2.dat

7     7     47 File2.dat

但这不起作用:

文件3:

       |
      |
     |
    |
   |
  |
 |
|

Java MyClass文件3.dat

0 characters
0 words
0 lines

wc文件3.dat

8     0     36 File3.dat

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

这里发生了什么?注意file2中的空行。为什么扫描仪似乎忽略了文件3中的空格?

共有1个答案

司徒修能
2023-03-14
while (in.hasNext()) {
    String line = in.nextLine();

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

while (in.hasNextLine()) {
    String line = in.nextLine();
 类似资料:
  • 在第一次迭代中,代码工作正常,我写了一些无效的东西(不是命令),代码打印警告并继续。但是其他迭代返回,如果(!scanin.hasnextline())返回null;,则返回

  • 本文向大家介绍html直接输入多个空格为什么只能显示一个空格?相关面试题,主要包含被问及html直接输入多个空格为什么只能显示一个空格?时的应答技巧和注意事项,需要的朋友参考一下 该行为由 CSS white-space 控制,其默认值 normal 的表现即为多个空格压缩成一个。

  • 刚开始编程,你们能告诉我在Java做多行输入的最好方法吗?像这样的小东西。 程序首先询问用户案例的数量。然后要求用户输入由空格分隔的2个整数。 第1列仅表示列数。id还希望能够得到第2列整数的和(25000+1000=?)

  • 问题内容: 我从过去的经验中了解到的是, 或将继续搜索,直到在同一行或下一行找到整数或双精度都没有关系,而通过扫描器类读取输入的字符串时,则会考虑空格和将光标保持在同一行,如果在in代码之前使用if 会考虑剩余的光标,有人可以帮助我更详细地了解这一点,尤其是关于它的开始位置和结束位置吗?另外,如果我认为任何错误是正确的,请告诉我。 问题答案: 您最初的理解是错误的。 我从过去的经验中了解到的是.n

  • 问题内容: 我正在尝试使小型程序更强大,而我需要一些帮助。 2号必须大于1 我也希望程序自动检查并忽略用户是否输入字符而不是数字。因为现在,当用户输入例如数字而不是数字时,程序将退出。 问题答案: 用途: 返回true是否可以使用方法将此扫描器输入中的下一个标记解释为默认基数中的值。扫描仪不会越过任何输入。 这是一个片段说明: 你不必或不必担心。请注意,由于这些方法不会超越任何输入,因此,如果你想

  • 我使用属性创建了两个EditText。 这里我使用的是硬件键盘,所以当我在textField上执行空格键事件时,焦点控制直接从editText视图转移到屏幕的其他随机视图。在普通文本字段类型中,它将其作为另一个字符,这很好。 任何人都知道如何使用空间键事件来保持对同一领域的关注。