System.in.read();比较

时间:2018-12-03 23:12:47

标签: java

在我们的课堂上,我们开始学习Java,我们受命解释为什么编写此代码:

library(tidyverse)
tbl <- tibble("A" = letters[1:4], "B" = letters[26:23], "C" = letters[c(1,3,5,7)], "D" = letters[c(2,4,6,8)], "pastecols" = c("B, C","B, D", "B, C, D", NA))

tbl %>%
  rowid_to_column() %>%
  mutate(
    pastecols = str_c("A, ", pastecols),
    pastecols = if_else(is.na(pastecols), "A", pastecols)
  ) %>%
  gather(colname, value, -pastecols, -rowid) %>%
  separate_rows(pastecols) %>%
  filter(pastecols == colname) %>%
  group_by(rowid) %>%
  summarise(
    pastecols = str_c(pastecols, collapse = ", "),
    result = str_c(value, collapse = ", ")
  )
#> # A tibble: 4 x 3
#>   rowid pastecols  result    
#>   <int> <chr>      <chr>     
#> 1     1 A, B, C    a, z, a   
#> 2     2 A, B, D    b, y, d   
#> 3     3 A, B, C, D c, x, e, f
#> 4     4 A          d

输出以下内容: output

在此屏幕快照中,我刚刚启动程序并键入“ a”,然后按Enter。

当我运行程序时,它要求我输入第一个字符,然后应要求我输入第二个字符,但是它跳过了该行并打印出“不同”的末尾。我不知道为什么。

代码应比较用户输入的两个字符,如果它们相同,则应打印“ Same”,否则应显示“ different”。

谢谢您的回答!

3 个答案:

答案 0 :(得分:1)

在这些情况下,您可能需要使用扫描仪:

class Inputif {
    public static void main(String args[]) throws java.io.IOException {

        char ch, ch2;

        Scanner scanner = new Scanner(System.in);

        System.out.print("Hit a key and press Enter: ");

        ch = scanner.next().charAt(0);

        System.out.println("Hit a second key and press Enter: ");

        ch2 = scanner.next().charAt(0);

        if (ch == ch2)
            System.out.println("Same");
        else
            System.out.println("different");
    }
}

这只是一个例子。您的问题是换行符,因此Scanner可以在这里为您提供帮助。

答案 1 :(得分:1)

我对您的程序进行了一些更改,以使您对正在发生的事情有所了解:

 public static void main(String args[]) throws java.io.IOException {

    char ch, ch2;

    System.out.print("Hit a key and press Enter: ");

    ch = (char) System.in.read();

    System.out.println("Hit a second key and press Enter: ");

    ch2 = (char) System.in.read();
    int x1=ch;
    int x2 = ch2;
    System.out.println("x1="+x1+" | x2="+x2);
    if (ch == ch2) System.out.println("Same"); else System.out.println("different");
}

两次运行以上程序:  -输入“ a”,然后按Enter。  -按下Enter键两次

说明: System.in是InputStream和InputStream https://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html的read方法的实例,该方法“从输入流中读取下一个数据字节”。 问题是,当您再次按Enter键时,您正在向输入流中添加一个额外的字节,并且ch2总是将其存储。  *注意:x1,x2将显示您击中的字符的ASCII码。

答案 2 :(得分:0)

好吧,正如已经说过的那样,您从Scanner进行的第二次阅读会在您的第一个字符之后读取一些内容,并且该内容是换行符(或您认为的Enter键)。您不那么相信,执行以下代码:

public class Helper {

    public static void main(String[] args) throws IOException {

        char ch, ch2;

        System.out.print("Hit a key and press Enter: ");
        ch = (char) System.in.read();
        System.out.println("your first read contains " + ch);

        System.out.println("Hit a second key and press Enter: ");
        ch2 = (char) System.in.read();
        System.out.println("your second read contains " + ch2);


        if (ch == ch2) System.out.println("Same");
        else System.out.println("different");

    }
}

输出:

  1. 点击键,然后按Enter:a
  2. 您的初次阅读包含
  3. 按下第二个键,然后按Enter:
  4. 您的二读读物
  5. 不同

请参见第5行中的新行...

现在,如果您按Enter键两次(第一个和第二个字符),结果将是 相同

P.S。 您可以使用调试器来代替打印到控制台,这是首选方法。