从扫描仪获取 char 输入

Take a char input from the Scanner

提问人:Ralph 提问时间:12/19/2012 最后编辑:RadiodefRalph 更新时间:10/19/2021 访问量:1107834

问:

我正在尝试找到一种从键盘获取输入的方法。char

我尝试使用:

Scanner reader = new Scanner(System.in);
char c = reader.nextChar();

此方法不存在。

我试着把.然而,它并不总是在所有情况下都有效,因为我从我的方法调用的另一个方法需要 a 作为输入。因此,我必须找到一种方法来显式地将 char 作为输入。cStringchar

有什么帮助吗?

输入 字符 java.util.scanner

评论


答:

184赞 Reimeus 12/19/2012 #1

您可以从以下位置获取第一个字符:Scanner.next

char c = reader.next().charAt(0);

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

char c = reader.findInLine(".").charAt(0);

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

char c = reader.next(".").charAt(0);

评论

7赞 Ralph 12/19/2012
实际上,它需要多个角色,但只对第一个角色起作用
3赞 Reimeus 4/16/2014
@user1804697只消费字符使用char c = reader.next("[a-zA-Z]").charAt(0);
17赞 11/30/2017
在这种情况下,“完全”和“严格”有什么区别?
2赞 bharal 6/8/2018
@Reimeus复制粘贴代码然后运行它的价值到底是什么?
3赞 1/4/2019
好吧,该版本在乱码输入时崩溃,而该版本没有。我的问题实际上更多的是关于“严格”和“确切”这两个词,而不是相应的代码片段。我不知道这些词不是同义词的上下文。next()bhjgfbergq35987t%$#%$#findInLine()
19赞 PermGenError 12/19/2012 #2

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

Scanner reader = new Scanner(System.in);
char c = reader.next().charAt(0);

为了安全起见,您也可以先调用字符串来删除任何空格。trim()

Scanner reader = new Scanner(System.in);
char c = reader.next().trim().charAt(0);

评论

0赞 norok2 6/25/2020
不会已经给你从第一个非白色字符开始的字符串了吗?reader.next()
0赞 NeoZoom.lua 12/20/2020
但这会消耗整个字符串。
18赞 Stephen C 12/19/2012 #3

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

  • 调用 Scanner,并提取 String 的第一个字符(例如 ) 如果要将行的其余部分读为字符,请遍历 String 中的其余字符。其他答案有这个代码。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 ...
    }
    

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

参考:

评论

0赞 NeoZoom.lua 12/20/2020
“这将导致 next() 标记化为长度恰好为一个字符的字符串。因此,您可以重复调用 next().charAt(0) 来迭代字符。我想你的意思是因为你已经?但是你的第三点+1。next()setDelimiter("")
0赞 Stephen C 12/20/2020
不,我真的是认真的.调用返回 .因此,如果要迭代值,则需要调用以获取第一个字符。(这是 Java,其中字符和一个字符串不是一回事。请注意,OP 明确指出 a 是必需的。next().charAt(0)nextStringcharcharAt(0)char
-8赞 AndroidShifu 1/6/2014 #4

最简单的方法是,首先将变量更改为 String 并接受 String 输入。然后,您可以使用 if-else 或 switch 语句基于输入变量进行控制,如下所示。

Scanner reader = new Scanner(System.in);

String c = reader.nextLine();
switch (c) {
    case "a":
        <your code here>
        break;
    case "b":
        <your code here>
        break;
    default: 
        <your code here>
}
1赞 Sahil Gupta 1/15/2014 #5

在 Scanner 类中输入字符的最佳方法是:

Scanner sca=new Scanner(System.in);
System.out.println("enter a character");
char ch=sca.next().charAt(0);
-2赞 vishu 12/22/2014 #6
import java.io.*;

class abc // enter class name (here abc is class name)
{
    public static void main(String arg[])
    throws IOException // can also use Exception
    {
        BufferedReader z =
            new BufferedReader(new InputStreamReader(System.in));

        char ch = (char) z.read();
    } // PSVM
} // class
65赞 hoat4 1/18/2015 #7

设置扫描程序:

reader.useDelimiter("");

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

0赞 HellPreacher 2/15/2015 #8
import java.util.Scanner;

public class userInput{
    public static void main(String[] args){
        // Creating your scanner with name kb as for keyBoard
        Scanner kb = new Scanner(System.in);

        String name;
        int age;
        char bloodGroup;
        float height;

        // Accepting Inputs from user
        System.out.println("Enter Your Name");
        name = kb.nextLine(); // for entire line of String including spaces
        System.out.println("Enter Your Age");
        age = kb.nextInt(); // for taking Int
        System.out.println("Enter Your BloodGroup : A/B/O only");
        bloodGroup  = kb.next().charAt(0); // For character at position 0
        System.out.println("Enter Your Height in Meters");
        height = kb.nextFloat(); // for taking Float value

        // closing your scanner object
        kb.close();

        // Outputting All
        System.out.println("Name : " +name);
        System.out.println("Age : " +age);
        System.out.println("BloodGroup : " +bloodGroup);
        System.out.println("Height : " +height+" m");

    }
}
4赞 gary69 2/25/2015 #9

这实际上不起作用:

char c = reader.next().charAt(0);

这个问题有一些很好的解释和参考:为什么 Scanner 类没有 nextChar 方法?“扫描仪使用分隔符模式将其输入分解为标记”,这是非常开放的。例如,当使用它时

c = lineScanner.next().charAt(0);

对于此输入行 "(1 + 9) / (3 - 1) + 6 - 2" 对 next 的调用返回 “(1”,C 将设置为 '(',并且您最终会在下次调用 next() 时丢失 '1'

通常,当您想要获取字符时,您希望忽略空格。这对我有用:

c = lineScanner.findInLine("[^\\s]").charAt(0);

参考:正则表达式来匹配一个不是空格的字符

评论

1赞 Bohemian 7/28/2015
仅供参考"[^\\s]" === "\\S"
-3赞 Nihaarika 3/27/2016 #10

您可以使用类型转换:

Scanner sc= new Scanner(System.in);
char a=(char) sc.next();

这样,由于函数“next()”,您将在 String 中获取输入,但由于括号中提到的“char”,它将被转换为字符。

这种通过在括号中提及目标数据类型来转换数据类型的方法称为类型化。它对我有用,我希望它对你有用:)

评论

0赞 Stephen C 1/13/2018
不能将 a 类型转换为 .Stringchar
-4赞 Robi 6/11/2016 #11

若要查找给定 sting 中字符的索引,可以使用以下代码:

package stringmethodindexof;

import java.util.Scanner;
import javax.swing.JOptionPane;

/**
 *
 * @author ASUS//VERY VERY IMPORTANT
 */
public class StringMethodIndexOf {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        String email;
        String any;
        //char any;

//any=JOptionPane.showInputDialog(null,"Enter any character or string to find out its INDEX NUMBER").charAt(0);       
//THE AVOBE LINE IS FOR CHARACTER INPUT LOL
//System.out.println("Enter any character or string to find out its INDEX NUMBER");
       //Scanner r=new Scanner(System.in);
      // any=r.nextChar();
        email = JOptionPane.showInputDialog(null,"Enter any string or anything you want:");
         any=JOptionPane.showInputDialog(null,"Enter any character or string to find out its INDEX NUMBER");
        int result;
        result=email.indexOf(any);
        JOptionPane.showMessageDialog(null, result);

    }

}
-2赞 Farhan 8/18/2016 #12

试试这个

Scanner scanner=new Scanner(System.in);
String s=scanner.next();
char c=s.charAt(0);

评论

0赞 NeoZoom.lua 12/20/2020
但这会消耗整个字符串,你回来了。
0赞 Harshal Mande 9/14/2016 #13

试试这个: 字符 c=S.nextLine().charAt(0);

-2赞 Arafe Zawad Sajid 11/23/2016 #14
Scanner key = new Scanner(System.in);
//shortcut way 
char firstChar=key.next().charAt(0);  
//how it works;
/*key.next() takes a String as input then,
charAt method is applied on that input (String)
with a parameter of type int (position) that you give to get      
that char at that position.
You can simply read it out as: 
the char at position/index 0 from the input String
(through the Scanner object key) is stored in var. firstChar (type char) */

//you can also do it in a bit elabortive manner to understand how it exactly works
String input=key.next();  // you can also write key.nextLine to take a String with spaces also
char firstChar=input.charAt(0);
char charAtAnyPos= input.charAt(pos);  // in pos you enter that index from where you want to get the char from

顺便说一句,你不能直接将字符作为输入。正如你在上面看到的,首先取一个 String,然后取 charAt(0);被找到并存储

-3赞 Razoowp 12/15/2016 #15

只需使用...

Scanner keyboard = new Scanner(System.in);
char c = keyboard.next().charAt(0);

这将获取下一个输入的第一个字符。

1赞 NIKUNJ KHOKHAR 6/16/2017 #16

您应该使用自定义输入读取器来更快地获得结果,而不是从读取 String 中提取第一个字符。 自定义 ScanReader 的链接和说明:https://gist.github.com/nik1010/5a90fa43399c539bb817069a14c3c5a8

扫描字符的代码:

BufferedInputStream br=new BufferedInputStream(System.in);
char a= (char)br.read();

评论

0赞 Markus 6/16/2017
您应该在答案中添加要点中的代码,因为它可能在一段时间内不可用。
0赞 NIKUNJ KHOKHAR 6/16/2017
@Markus添加了用于扫描字符的字符。
1赞 Rakesh Kumar B 10/16/2017 #17
import java.util.Scanner;

public class Test { 
    public static void main(String[] args) {
 
        Scanner reader = new Scanner(System.in);
        char c = reader.next(".").charAt(0);

    }
}

只获得一个字符char c = reader.next(".").charAt(0);

评论

0赞 Rakesh Kumar B 10/16/2017
要只获取一个字符,请 char c = reader.next(“.”)。字符(0);
0赞 John Born 4/20/2018 #18
// Use a BufferedReader to read characters from the console.
import java.io.*;
class BRRead {
public static void main(String args[]) throws IOException
{
char c;
BufferedReader br = new
BufferedReader(new InputStreamReader(System.in));
System.out.println("Enter characters, 'q' to quit.");
// read characters
do {
c = (char) br.read();
System.out.println(c);
} while(c != 'q');
}
}

评论

1赞 NeoZoom.lua 12/20/2020
和 和有什么不一样?你在代码中使用了它,但你没有解释。InputStreamReaderBufferedReader
-1赞 Abdo Bmz 4/20/2018 #19

您应该使用 scanner.next() 获取 String,并在返回的 String 上调用 String.charAt(0) 方法。
示例:

    import java.util.Scanner;

    public class InputC{


            public static void main(String[] args) {
                // TODO Auto-generated method stub
                   // Declare the object and initialize with
                   // predefined standard input object
                    Scanner scanner = new Scanner(System.in);
                    System.out.println("Enter a character: ");
                    // Character input
                    char c = scanner.next().charAt(0);
                    // Print the read value
                    System.out.println("You have entered: "+c);
            }


        }

输出

Enter a character: 
a
You have entered: a
5赞 brayden Prestwich 11/18/2018 #20

您可以非常简单地解决“一次获取一个字符”的键盘输入问题。无需全部使用扫描仪,也无需清除输入缓冲区作为副作用,使用此功能。

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

如果您只需要与 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);
        }
    }
}  

希望这对您有所帮助,祝您好运!P.S. 对不起,我知道这是一篇较旧的帖子,但我希望我的回答能带来新的见解,并可能帮助其他也有这个问题的人。

1赞 Omkar hiremath 4/24/2019 #21

有两种方法,您可以取一个字符,也可以严格采用一个字符。 当您精确使用时,无论您输入多少个字符,读者都只会取第一个字符。

例如:

import java.util.Scanner;  

public class ReaderExample {  

    public static void main(String[] args) {  

        try {  

        Scanner reader = new Scanner(System.in);

        char c = reader.findInLine(".").charAt(0);

            reader.close();  

            System.out.print(c);

        } catch (Exception ex) {  

            System.out.println(ex.getMessage());  

        }



    }  

}  

当你给出一组字符作为输入时,比如“abcd”,读者只会考虑第一个字符,即字母“a”

但是当你严格使用时,输入应该只是一个字符。如果输入有多个字符,则读取器不会接受输入

import java.util.Scanner;  

public class ReaderExample {  

    public static void main(String[] args) {  

        try {  

        Scanner reader = new Scanner(System.in);

        char c = reader.next(".").charAt(0);

            reader.close();  

            System.out.print(c);

        } catch (Exception ex) {  

            System.out.println(ex.getMessage());  

        }



    }  

}  

假设您给出输入“abcd”,则不采用任何输入,变量 c 将具有 Null 值。

-1赞 bilal Tashfeen 2/1/2020 #22

您只需要编写它即可在 char 类型中获取值。

char c = reader.next().charAt(0);
-2赞 Steve 1/29/2021 #23

从用户输入中读取字符的简单解决方案。 读取字符串。然后在 String 上使用 charAt(0)

Scanner reader = new Scanner(System.in);
String str = reader.next();
char c = str.charAt(0);

就是这样。

-1赞 Kalhara Tennakoon 10/19/2021 #24

尝试以下操作。

Scanner reader = new Scanner(System.in);
char c = reader.next().charAt(0);

这将从键盘上获取一个字符。