从扫描仪获取char输入

Ral*_*lph 112 java input char java.util.scanner

我试图找到一种char从键盘输入的方法.

我试过用:

Scanner reader = new Scanner(System.in);
char c = reader.nextChar();
Run Code Online (Sandbox Code Playgroud)

此方法不存在.

我试着把它c作为一个String.然而,它并不总是适用于所有情况,因为我从我的方法调用的另一种方法需要一个char输入.因此,我必须找到一种方法来明确地将char作为输入.

有帮助吗?

Rei*_*eus 154

你可以从第一个角色Scanner.next:

char c = reader.next().charAt(0);
Run Code Online (Sandbox Code Playgroud)

要使用恰好一个字符,您可以使用:

char c = reader.findInLine(".").charAt(0);
Run Code Online (Sandbox Code Playgroud)

严格使用一个字符,您可以使用:

char c = reader.next(".").charAt(0);
Run Code Online (Sandbox Code Playgroud)

  • 在这种情况下,"确切"和"严格"之间有什么区别? (8认同)
  • 实际上它占用了多个角色,但只对第一个角色起作用 (4认同)
  • @user1804697 只使用字符使用`char c = reader.next("[a-zA-Z]").charAt(0);` (2认同)
  • @Reimeus复制粘贴代码然后运行它的确切值是什么? (2认同)
  • 好吧,`next()` 版本在乱码输入 `bhjgfbergq35987t%$#%$#` 上崩溃,而 `findInLine()` 版本没有。我的问题实际上更多是关于“严格”和“确切”这两个词,而不是相应的代码片段。我不知道这些词不是同义词的上下文。 (2认同)

hoa*_*at4 50

设置扫描仪:

reader.useDelimiter("");
Run Code Online (Sandbox Code Playgroud)

之后reader.next()将返回单字符串.


Per*_*ror 16

没有API方法可以从扫描程序中获取字符.您应该在返回的String上获取String using scanner.next()和invoke String.charAt(0)方法.

Scanner reader = new Scanner(System.in);
char c = reader.next().charAt(0);
Run Code Online (Sandbox Code Playgroud)

为了安全地使用空格,您还可以首先调用trim()字符串来删除任何空格.

Scanner reader = new Scanner(System.in);
char c = reader.next().trim().charAt(0);
Run Code Online (Sandbox Code Playgroud)


Ste*_*n C 11

有三种方法可以解决这个问题:

  • 调用next()扫描程序,并提取字符串的第一个字符(例如charAt(0))如果要将行的其余部分读作字符,请迭代字符串中的其余字符.其他答案都有这个代码.

  • 用于setDelimiter("")将分隔符设置为空字符串.这将导致next()标记为正好一个字符长的字符串.那么你可以反复调用next().charAt(0)迭代字符.然后,您可以将分隔符设置为其原始值,并以正常方式继续扫描!

  • 使用Reader API而不是Scanner API.该Reader.read()方法提供从输入流中读取的单个字符.例如:

    Reader reader = new InputStreamReader(System.in);
    int ch = reader.read();
    if (ch != -1) {  // check for EOF
        // we have a character ...
    }
    
    Run Code Online (Sandbox Code Playgroud)

当您从控制台通过读取时System.in,输入通常由操作系统缓冲,并且仅在用户键入ENTER时"释放"到应用程序.因此,如果您打算让应用程序响应各个键盘敲击,这是行不通的.您需要执行一些特定于操作系统的本机代码来关闭或解决操作系统级别的控制台的行缓冲.

参考:


bra*_*ich 5

您可以非常简单地解决“一次抓取键盘输入一个字符”的问题。不必全部使用扫描仪,也不必通过使用它来清除输入缓冲区作为副作用。

char c = (char)System.in.read();
Run Code Online (Sandbox Code Playgroud)

如果您所需要的只是与 C 语言“getChar()”函数相同的功能,那么这将非常有效。“System.in.read()”的最大优点是在您抓取每个字符后不会清除缓冲区。因此,如果您仍然需要所有用户输入,您仍然可以从输入缓冲区中获取其余部分。该"char c = scanner.next().charAt(0);"方式确实会抓取字符,但会清除缓冲区。

// Java program to read character without using Scanner
public class Main
{
    public static void main(String[] args)
    {
        try {
            String input = "";
            // Grab the First char, also wait for user input if the buffer is empty.
            // Think of it as working just like getChar() does in C.
            char c = (char)System.in.read();
            while(c != '\n') {
                //<do your magic you need to do with the char here>
                input += c; // <my simple magic>

                //then grab the next char
                c = (char)System.in.read();
            }
            //print back out all the users input
            System.out.println(input);
        } catch (Exception e){
            System.out.println(e);
        }
    }
}  
Run Code Online (Sandbox Code Playgroud)

希望这有帮助,祝你好运!PS抱歉,我知道这是一篇较旧的帖子,但我希望我的回答带来新的见解,并可以帮助其他也有此问题的人。