【问题标题】:BufferedReader / Scanner Last Line Reading IssueBufferedReader / Scanner 最后一行读取问题
【发布时间】:2016-08-29 06:26:36
【问题描述】:

在解决黑客级别的问题时,我面临扫描仪/缓冲读取器无法读取最后一个问题。因为他们提供的输入就像

10

abcdefghijk

2

R 1 2

W 3 4

所以扫描仪/缓冲读取器都无法读取最后一行。如果输入是这样的,那么代码似乎可以正常工作。

10

abcdefghijk

2

R 1 2

W 3 4

(输入结束)

public class ScannerTest {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        Scanner input = new Scanner(System.in);
        int len = input.nextInt();
        input.nextLine();
        String inputString = input.nextLine();
        int qc = input.nextInt();
        input.nextLine();
        System.out.println();
        System.out.println(len + inputString + qc);
        for(int i=0;i<qc;i++){
            String l = input.next();
            int le = input.nextInt();
            int ri =  input.nextInt();
            input.nextLine();
            System.out.println(l+le+ri);
        }
        input.close();
    }
}

这是我正在使用的示例代码。我知道我们需要一个 \r 或 \n 在行尾从扫描仪/缓冲阅读器读取行。但是任何人都可以为这个问题提供解决方案,因为输入来自预定义的系统。

【问题讨论】:

  • 循环的最后一次迭代以input.nextLine() 结束,因此会阻塞直到找到 EOL,或者直到输入流关闭,但没有 EOL,并且 System.in 永远不会关闭.
  • 我也试过没有 input.nextLine() 但它给出了相同的结果。

标签: java


【解决方案1】:

BufferedReader 会读取最后一行,即使它没有以换行符结尾。 System.in 是罪魁祸首,它自己做行缓冲。 原生系统:假设您按下了几个退格键来更改最后一个数字...

【讨论】:

    【解决方案2】:

    问题出在这里:

    input.nextLine();
    String inputString = input.nextLine();
    

    你正在消耗一条线来扔掉它。

    另一件事是:尤其是在处理标准库时 - 不要假设某些东西已损坏/不起作用。在 99,999% 的情况下,问题出在您的代码中。

    【讨论】:

    • 该行代码用于读取输入行的其余部分(int 标记后的换行符)。感谢您的意见。
    猜你喜欢
    • 1970-01-01
    • 2014-05-21
    • 2011-03-29
    • 2013-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-28
    相关资源
    最近更新 更多