Pegue uma entrada de char do scanner


124

Estou tentando encontrar uma maneira de obter uma charentrada do teclado.

Eu tentei usar:

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

Este método não existe.

Eu tentei tomar ccomo String. No entanto, nem sempre funcionaria em todos os casos, pois o outro método que estou chamando do meu método exige a charcomo entrada. Portanto, tenho que encontrar uma maneira de usar explicitamente um char como entrada.

Qualquer ajuda?

Respostas:


159

Você pode pegar o primeiro caractere de Scanner.next:

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

Para consumir exatamente um caractere, você pode usar:

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

Para consumir estritamente um caractere, você pode usar:

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


7
Na verdade, está tendo mais de um personagem, mas atuando apenas no primeiro personagem
Ralph

1
@ user1804697 para consumir apenas caractereschar c = reader.next("[a-zA-Z]").charAt(0);
Reimeus

10
Qual é a diferença entre "exatamente" e "estritamente" neste contexto?

2
@ Reimeus, qual é exatamente o valor em copiar e colar código e executá-lo?
precisa saber é

53

Scanner de configuração:

reader.useDelimiter("");

Depois disso reader.next(), retornará uma sequência de caracteres únicos.


17

Não existe um método de API para obter um caractere do scanner. Você deve obter a String usando scanner.next()e invocar o String.charAt(0)método na String retornada.

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

Para garantir a segurança dos espaços em branco, você também pode chamar trim()a string primeiro para remover os espaços em branco.

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

Você reader.next()já não forneceria a string a partir do primeiro caractere não branco?
norok2 25/06

12

Existem três maneiras de abordar esse problema:

  • Ligue next()para o Scanner e extraia o primeiro caractere da String (por exemplo charAt(0)). Se você quiser ler o restante da linha como caracteres, itere sobre os caracteres restantes na String. Outras respostas têm esse código.

  • Use setDelimiter("")para definir o delimitador para uma sequência vazia. Isso fará com next()que o tokenize em seqüências de caracteres com exatamente um caractere. Então você pode ligar repetidamentenext().charAt(0) para iterar os caracteres. Você pode então definir o delimitador para o valor original e retomar a digitalização da maneira normal!

  • Use a API do Reader em vez da API do scanner. O Reader.read()método fornece uma única leitura de caractere do fluxo de entrada. Por exemplo:

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

Quando você lê do console via System.in, a entrada geralmente é armazenada em buffer pelo sistema operacional e somente "liberada" para o aplicativo quando o usuário digita ENTER. Portanto, se você pretende que seu aplicativo responda a toques de teclado individuais, isso não vai funcionar. Você precisaria fazer algumas coisas de código nativo específicas do SO para desativar ou contornar o buffer de linha do console no nível do SO.

Referência:


Por favor, você poderia dar um exemplo do que disse
Ralph

4

Você pode resolver esse problema de "pegar a entrada do teclado um caractere de cada vez" de maneira muito simples. Sem ter que usar um scanner tudo e também não limpar o buffer de entrada como efeito colateral, usando isso.

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

Se tudo o que você precisa é da mesma funcionalidade que a função "getChar ()" da linguagem C, isso funcionará muito bem. A grande vantagem do "System.in.read ()" é que o buffer não é limpo depois de cada caracterização. Portanto, se você ainda precisar da entrada de todos os usuários, poderá obter o restante do buffer de entrada. O "char c = scanner.next().charAt(0);"caminho pega o char, mas limpa o buffer.

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

Espero que isso seja útil e boa sorte! PS Desculpe, eu sei que este é um post mais antigo, mas espero que minha resposta traga novas idéias e possa ajudar outras pessoas que também têm esse problema.


3

Na verdade, isso não funciona:

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

Há algumas boas explicações e referências nesta pergunta: Por que a classe Scanner não possui um método nextChar? "Um scanner divide sua entrada em tokens usando um padrão delimitador", que é bastante aberto. Por exemplo, ao usar este

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

para esta linha de entrada "(1 + 9) / (3 - 1) + 6 - 2" a chamada para os próximos retornos "(1", c será definida como '(' e você acabará perdendo o ' 1 'na próxima chamada para a próxima ()

Normalmente, quando você deseja obter um personagem, você gostaria de ignorar o espaço em branco. Isso funcionou para mim:

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

Referência: regex para corresponder a um único caractere que não é um espaço


FYI"[^\\s]" === "\\S"
Bohemian

2

A melhor maneira de obter a entrada de um caractere na classe Scanner é:

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

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

    }
}


1

Você deve usar seu leitor de entrada personalizado para obter resultados mais rápidos, em vez de extrair o primeiro caractere da leitura de String. Link para o ScanReader personalizado e explicação: https://gist.github.com/nik1010/5a90fa43399c539bb817069a14c3c5a8

Código para digitalizar Char:

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

Você deve adicionar o código da essência na sua resposta, pois pode estar indisponível por algum tempo.
Markus

@ Markus adicionado para verificação de caracteres.
NIKUNJ KHOKHAR

1

Existem duas abordagens: você pode usar exatamente um caractere ou estritamente um caractere. Quando você usa exatamente, o leitor terá apenas o primeiro caractere, independentemente de quantos caracteres você inserir.

Por exemplo:

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

        }



    }  

}  

Quando você fornecer um conjunto de caracteres como entrada, diga "abcd", o leitor considerará apenas o primeiro caractere, ou seja, a letra 'a'

Mas quando você usa estritamente, a entrada deve ser apenas um caractere. Se a entrada tiver mais de um caractere, o leitor não aceitará a entrada.

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

        }



    }  

}  

Suponha que você dê a entrada "abcd", nenhuma entrada seja feita e a variável c terá valor nulo.


0
package Pack;

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

    }
}

Para obter apenas um caractere char c = reader.next ("."). CharAt (0);


Para obter apenas um caractere char c = reader.next ("."). CharAt (0);
precisa

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

0

Você deve obter a String usando o scanner.next () e chamar o método String.charAt (0) na String retornada.
Exemplo:

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


        }

resultado

Enter a character: 
a
You have entered: a

0

você só precisa escrever isso para obter valor no tipo de caractere.

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

-1
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

-1

Tente isto

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

-1
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

A propósito, você não pode pegar um char diretamente como uma entrada. Como você pode ver acima, uma String é primeiro obtida e depois charAt (0); é encontrado e armazenado


-1

Apenas use...

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

Isso obtém o primeiro caractere da próxima entrada.


-2

Você pode usar a conversão de texto:

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

Dessa forma, você receberá a entrada em String devido à função 'next ()', mas depois será convertida em caractere devido ao 'char' mencionado entre colchetes.

Esse método de conversão do tipo de dados, mencionando o tipo de dado de destino entre colchetes, é chamado de digitação. Funciona para mim, espero que funcione para você :)


Você não pode digitar de a Stringpara a char.
Stephen C

-3

Para encontrar o índice de um caractere em uma determinada picada, você pode usar este código:

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

    }

}

-7

A maneira mais fácil é, primeiro altere a variável para uma String e aceite a entrada como uma string. Em seguida, você pode controlar com base na variável de entrada com uma instrução if-else ou switch da seguinte maneira.

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>
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.