我试图找到一种从键盘上获取char输入的方法。

我尝试使用:

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


此方法不存在。

我尝试将c用作String。但是,由于我要从我的方法中调用的另一种方法需要char作为输入,因此它并不总是在每种情况下都有效。因此,我必须找到一种将char用作输入的方法。

有帮助吗?

#1 楼

您可以从Scanner.next中提取第一个字符:

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


要完全使用一个字符,可以使用:

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


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

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


评论


参见stackoverflow.com/questions/4007534/…

– Reimeus
2012-12-18 23:36

实际上,它占用多个字符,但仅作用于第一个字符

–拉尔夫
2012年12月19日在2:39

在这种情况下,“完全”和“严格”有什么区别?

–user6096242
17年11月29日在18:02

@Reimeus复制粘贴代码然后运行它的值到底是什么?

–巴尔
18年6月7日在17:37

好吧,next()版本在乱码的输入bhjgfbergq35987t%$#%$#上崩溃,而findInLine()版本没有崩溃。我的问题确实更多地是关于“严格”和“完全”这两个词,而不是相应的代码片段。我没有意识到这些单词不是同义词的上下文。

–user6096242
19年1月4日,13:50



#2 楼

设置扫描程序:

reader.useDelimiter("");


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

#3 楼

没有API方法可从扫描仪获取字符。您应该使用scanner.next()来获取String并在返回的String上调用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);


评论


reader.next()是否已经从第一个非白字符开始为您提供了字符串?

– norok2
6月25日10:07

但这会消耗整个字符串。

–下雨
12月20日下午5:12

#4 楼

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


在Scanner上调用next(),并提取String的第一个字符(例如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 ...
}




通过System.in从控制台读取时,输入通常由操作系统缓冲,并且只有“当用户键入ENTER时,“已释放”到应用程序。因此,如果您打算让应用程序响应单个的键盘击键,那么它将无法正常工作。您可能需要做一些特定于OS的本机代码工作,才能在OS级别上关闭或解决控制台的行缓冲。

参考:


如何从Java控制台中读取单个字符(在用户键入时)?


评论


“这将使next()标记化为恰好一个字符长的字符串。因此,您可以重复调用next()。charAt(0)来迭代字符。”我认为您的意思是next()仅因为您已经setDelimiter(“”)?但是第三点是+1。

–下雨
12月20日5:20



不,我确实是说next()。charAt(0)。下一个调用返回一个字符串。因此,如果要迭代char值,则需要调用charAt(0)以获取第一个字符。 (这是Java,其中一个字符和一个字符串不是同一东西。)请注意,OP明确指出必须使用char。

– Stephen C
12月20日5:30



#5 楼

您可以非常简单地解决“一次抓住一个键盘输入一个字符”的问题。通过使用此功能,无需全部使用Scanner,也不必清除输入缓冲区作为副作用。

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);
        }
    }
}  


祝您有帮助,祝您好运!附言抱歉,我知道这是一篇较旧的文章,但我希望我的回答能带来新的见解,并可能对其他有此问题的人有所帮助。

#6 楼

这实际上是行不通的:

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);


参考:
正则表达式匹配单个字符但是一个空间

评论


仅供参考“ [^ \\ s]” ===“ \\ S”

–波西米亚风格♦
15年7月27日在16:30

#7 楼

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

Scanner sca=new Scanner(System.in);
System.out.println("enter a character");
char ch=sca.next().charAt(0);


#8 楼

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

扫描代码Char:

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


评论


您应在要点中添加要点中的代码,因为有时可能无法使用。

–马库斯
17年6月16日在6:20

添加了@Markus来扫描char。

– NIKUNJ KHOKHAR
17年6月16日在6:24

#9 楼

有两种方法,您可以只使用一个字符,也可以只使用一个字符。
当您完全使用时,无论您输入多少个字符,阅读器都只会采用第一个字符。

例如:

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'

但是严格使用时,输入内容应仅为一个字符。如果输入不止一个字符,那么阅读器将不接受输入。假设输入为“ abcd”,则不接受输入,并且变量c将具有Null值。

#10 楼

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);

评论


仅获得一个字符char c = reader.next(“。”)。charAt(0);

– Rakesh Kumar B
17-10-16在13:52

#11 楼

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");

    }
}


#12 楼

试试这个:
char c = S.nextLine()。charAt(0);

#13 楼

您应该使用Scanner.next()获取String并在返回的String.Exmple上调用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);
            }


        }


output

Enter a character: 
a
You have entered: a


#14 楼

您只需要编写此代码即可获取char类型的值。

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


#15 楼

// 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');
}
}


评论


InputStreamReader和BufferedReader有什么区别?您在代码中使用了它,但是没有解释。

–下雨
12月20日下午5:22

#16 楼

只需使用...
Scanner keyboard = new Scanner(System.in);
char c = keyboard.next().charAt(0);

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

#17 楼

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


#18 楼

试试这个

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


评论


但这会消耗整个字符串,您会返回。

–下雨
12月20日5:13



#19 楼

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


顺便说一句,您不能直接将char作为输入。如上所示,首先获取一个String,然后获取charAt(0);找到并存储

#20 楼

您可以使用类型转换:

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


这样,由于函数'next()',您将在String中接受输入,但由于在括号中提到的'char'。

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

评论


您不能将字符串类型转换为char。

– Stephen C
18年1月12日在23:59

#21 楼

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

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);

    }

}


#22 楼

最简单的方法是,首先将变量更改为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>
}