在程序中给出值并给出用户输入时输出的差异

时间:2015-12-17 11:01:03

标签: java inputstream

public class ForComma {
    public static void main(String args[]) throws java.io.IOException {
        System.out.println("enter j");
        int j = (int) System.in.read();
        for(int i=0; i<j ; j--, i++){
            System.out.println("i is " + i + "\tj is " + j);
        }
    }
}

for-loop中,当j被定义为 j = 10 时,结果与输入 10 时的结果不同用户输入。为什么呢?

3 个答案:

答案 0 :(得分:1)

这是因为您正在使用System.in.read()从控制台获取值。

它实际上会读取下一个数据字节,在你的情况下,ascii代码为1,即49

只需用以下代码替换您的代码:

for(i=0,j=Integer.parseInt(System.in.readLine());i<j;j--,i++){

答案 1 :(得分:1)

您正在使用System.in.read()来阅读用户输入,这是错误的。

当输入到控制台时,它将作为Stream提供给我们的软件。流是特殊的。他们不会一劳永逸。它们按字符给出您在控制台中输入的值。

如果您在控制台中输入 10 ,当您按回车键时,字符将被赋予流。致电read()后,49将作为输出(As 49为ASCII值1)。下次调用read()时,48将作为输出(As 48为ASCII值0)。下次拨打read()时,13将作为输出(As 13是输入密钥的ASCII值)。

因此,您必须读取所有这3个字节才能确定用户输入的值。但你不必担心。 Java有完成此任务的类,我们只需要调用所需的方法。

import java.util.Scanner;
public class ForComma {
    public static void main(String args[]) throws java.io.IOException {
        System.out.print("Enter j: ");
        Scanner s = new Scanner(System.in);
        int j = s.nextInt();
        for (int i = 0; i < j; j--, i++) {
            System.out.println("i is " + i + "\tj is " + j);
        }
    }
}

答案 2 :(得分:0)

System.in.read doku:

  

从输入流中读取下一个数据字节。值字节作为int返回,范围为0到255.如果没有字节可用,因为已到达流的末尾,则返回值-1。此方法将阻塞,直到输入数据可用,检测到流的末尾或抛出异常。   子类必须提供此方法的实现。

那会发生什么? System.in.read实际上读取输入,但只是下一个字节块。事实上,对于输入10,这只是一个。 这会导致int值为49

如果您将此值解析为char,那么您会注意到您获得了char 1的ascii表示而不是int数字{ {1}}。