For 循环导致 Scanner 读取另一行

我正在尝试做 CCC 2019 的 J3 问题,我的代码大部分都有效,除了我的 for 循环导致 Scanner 在读取最后一行之前读取额外的一行。您可以在这里找到确切的问题:https ://dmoj.ca/problem/ccc19j3

预期输入:

4

+++===!!!!

777777......TTTTTTTTTTTT

(AABBC)

3.1415555

预期输出:


3 + 3 = 4 !

6 7 6 . 12 T

1 ( 2 A 2 B 1 C 1 )

1 3 1 . 1 1 1 4 1 1 4 5

我的输出:


3 + 3 = 4 ! 

6 7 6 . 12 T 

1 ( 2 A 2 B 1 C 1 ) 

"Scanner waits for another line here"

"If I press enter, it then spits out the last line."


1 3 1 . 1 1 1 4 1 1 4 5

我似乎找不到问题,我尝试将 for 循环变成一个方法,然后为每个输入接受 Scanner 的四个不同输入(str0、str1 等),它仍然读取另一行。我在 sc.nextInt() 之后添加了 sc.nextLine() 以确保 Scanner 读取输入的下一行和 int 旁边的空格。我尝试省略最后一行输入,但它只是在最后一行之前读取另一行。所以这个问题似乎只限于最后一行而不是特定的输入。


 public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);

        int counter = 1;

        int n = sc.nextInt();

        sc.nextLine();

        for (int i = 0; i < n; i++){

            String str = sc.nextLine();

            for (int j = 0; j < str.length(); j++){

                if (j != str.length() - 1 && str.charAt(j) == str.charAt(j+1)){

                    counter++;

                }else{

                    System.out.print(counter + " " + str.charAt(j) + " ");

                    counter = 1;

                }

            }

            System.out.println();

        }

    }


慕斯709654
浏览 101回答 1
1回答

ITMISS

听起来您遇到了行尾问题。Scanner.nextLine()将从输入中读取一行加上行分隔符,然后丢弃行分隔符,然后返回它读取的行的实际内容。行分隔符可以是一个 LF 字符 ( '\n') 或一个 CR 字符 ( '\r'),或者一个 CR 字符后跟一个 LF 字符,或者是几种很少使用的单字符 Unicode 行结尾之一。这种分隔符的多样性反映了各种操作系统如何表示文本文件的历史变化。尝试Scanner通过接受所有可能性来提供帮助,无论它恰好在哪个平台上运行。如果我们假设当您粘贴测试数据时,您观察到的行为会以某种方式在您粘贴的程序和您要粘贴到的控制台之间的交互导致您的程序被赋予以单个 CR 结尾的行. 然后Scanner.nextLine()需要查看它给出的下一个字符是否是 LF——因为如果是,那么它也应该吃掉它,作为行尾的一部分。因此它只会在看到另一个角色后才会返回。另一方面,当您手动输入时,您的回车键可能会产生 LF 或 CR-LF 组合。nextLine()一旦看到行结束,它们中的任何一个都会很高兴。如果你一行一行地粘贴这些行,你应该能够检验这个假设。然后您可能会看到第一行的翻译仅在您粘贴第二行之后出现,依此类推。您可能不需要为了自动判断编程挑战而担心这一点。判断系统不会将测试输入粘贴到您的程序中,但可能会将其通过管道传输,这意味着您的程序可以在预期生成之前看到所有输入,直到最后的文件结束指示输入。在那种环境下它应该可以正常工作。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java