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 时的结果不同用户输入。为什么呢?
答案 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}}。